【发布时间】:2010-10-02 05:15:10
【问题描述】:
我们正在用 ASP.NET 开发一个 CMS。我们喜欢附加组件的想法(例如在 Wordpress 中,任何开发人员都可以添加菜单按钮或小部件),并且希望开发人员能够对我们的系统执行相同的操作。
但是我认为 C# 是一种编译语言这一事实是附加组件的障碍。
我说的对吗?或者有没有办法为 ASP.NET 应用程序创建附加组件?
【问题讨论】:
我们正在用 ASP.NET 开发一个 CMS。我们喜欢附加组件的想法(例如在 Wordpress 中,任何开发人员都可以添加菜单按钮或小部件),并且希望开发人员能够对我们的系统执行相同的操作。
但是我认为 C# 是一种编译语言这一事实是附加组件的障碍。
我说的对吗?或者有没有办法为 ASP.NET 应用程序创建附加组件?
【问题讨论】:
C# 是一种编译语言这一事实根本不是问题。事实上,.NET 框架应该让加载其他代码变得相对容易(就像 Java 一样,出于同样的原因)。查看Managed Extensibility Framework,这是关于在托管代码中加载附加组件的全部内容。
【讨论】:
这根本不是障碍。 MEF已经提到过,你也可以使用:
【讨论】:
我不确定是否专门针对 ASP.NET,但在我所知道的唯一编译编程语言(Objective-C/Cocoa)中,存在可以动态加载的 Bundle 的概念。我不确定这在后端是如何工作的,但我猜 C#/ASP.NET 有一些类似的系统。
【讨论】:
我不知道它在 Wordpress 中是如何完成的,但应该有很多方法。您可以允许开发人员上传带有编译代码的程序集,或者您可以允许他们上传 C# 或 IronPython 或任何支持的代码并动态编译它。也许你可以使用WebParts 来完成你的任务。
【讨论】:
Microsoft 已创建 Managed Extensibility Framework (MEF),专门针对此问题:为 .NET 应用程序提供 .NET 插件。它是 Visual Studio(未来版本)用于编写托管插件的框架。
但是,请考虑为此使用动态脚本语言!像这样的问题正是他们专门设计的。如果您在应用程序中托管 Dynamic Language Runtime,这不仅意味着您的用户可以使用 a 脚本语言扩展应用程序,甚至可以使用 任何 动态语言(脚本或否则)存在 DLR 实现:Ruby、Python、Smalltalk、Scheme、JavaScript、PHP,应有尽有。最大的缺点:DLR 还没有发布。
【讨论】:
在 C# 中,您可以创建任何程序集,将它们链接为 DLL 文件,然后做任何您想做的事情。
通常的情况是定义某种必须由所有插件实现的插件接口。
然后您可以从文件系统加载所有插件(通过迭代插件 DLL),找到实现接口的类,实例化并使用它。
如果您想为插件提供可卸载性和安全性,您可以创建一个应用程序域并将插件加载到该域,这会增加复杂性,但也会增加稳定性(一个糟糕的插件不会使您的应用程序崩溃)。
如果您想要一个具体的答案,请更具体地询问:-)
【讨论】:
将挂钩安装到位并不难。您必须提前定义附加功能将出现的位置。例如:绘制菜单时,您可以使用反射在其他 dll(具有特定名称和位置)中搜索“BuildMenu”功能。您将为此函数签名定义 API。它可能必须返回要添加到基本菜单项集合的项目列表。
【讨论】: