如何创建可插拔的ASP.Net网站?
创建网站的最佳做法是什么,能够为其开发插件?
就像您想要创建一个博客模块一样,您希望用户或共同开发人员添加插件来扩展此模块function。
更新:感谢超速的答案,但我认为这对我来说已经过时了。 是不是有一个更简单的解决方案,就像我看到的blogengine插件创建系统你只需要用[Extension]来装饰类插件。
我是中级核心开发人员,所以我在考虑基类,inheritance,接口,你怎么看?
编辑
我根据您的问题编辑完全重写了我的答案。
让我向您展示使用最少的步骤实现插件架构是多么容易。
第1步:定义插件将实现的接口。
namespace PluginInterface { public interface IPlugin { string Name { get; } string Run(string input); } }
第2步:创建一个实现IPlugin的插件。
namespace PluginX { using PluginInterface; public class Plugin : IPlugin { public string Name { get { return "Plugin X"; } } public string Run(string input) { return input; } } }
第3步:运行插件。
namespace PluginTest { using System; using System.IO; using System.Runtime.Remoting; using PluginInterface; class Program { static void Main( string[] args ) { string pluginFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PluginX.dll"); ObjectHandle handle = Activator.CreateInstanceFrom(pluginFile, "PluginX.Plugin"); IPlugin plugin = handle.Unwrap() as IPlugin; string pluginName = plugin.Name; string pluginResult = plugin.Run("test string"); } } }
请记住,这只是插件架构的基本,最直接的例子。 你也可以做一些事情
- 创建一个插件主机,在其自己的
AppDomain
运行您的插件 - 选择接口,抽象类或属性来装饰你的插件
- 使用reflection,接口,IL发出的thunk或委托来完成后期绑定工作
如果你的设计如此指示。
将技术和架构视角分开是很有价值的:
- 在代码级别, MEF (Managed Extensibility Framework)是一个良好的开端。 这是一个简单的例子。
- 任何其他DI(dependency injection框架)都可以很好地工作(即Unity)
在架构层面看到这个问题很好:
- 来自p&p的Web客户端软件工厂 。 这里不仅有关于“如何创建复合Web应用程序?”的技术信息,而且还有关于这些信息的详细信息。 见例子。 。 有Modularity Boundle包。
- Spring框架 。
如果您阅读并尝试其中一些框架,我认为这是一种快速而有效的方法。 如果你发现一些令人反感的东西,ofcoz会阅读这些来源。
编辑
如果您正在搜索可扩展的博客引擎,请先尝试使用Blog Engine 。 它来自ASP.NET社区。
这听起来像是Microsoft的Managed Extensibility Framework的一项工作。 它现在处于预览版本中,但它似乎比滚动自己的框架更好。 有关如何在网站上使用此function的指南链接。
如果您希望看到一个真实的,开源的应用程序,请参考DotNetNuke 。