如何创建可插拔的ASP.Net网站?

时间:2009-04-11 21:00:38

标签: c# asp.net

创建网站的最佳做法是什么,能够为其开发插件?

就像您想要创建博客模块一样,您希望用户或共同开发人员添加插件来扩展此模块功能。

更新 感谢超速的答案,但我认为这对我来说已经过时了。是不是有一个更简单的解决方案,就像我看到的blogengine插件创建系统你只需要用[Extension]来装饰类插件。

我是中级核心开发人员,所以我在考虑基类,继承,接口,你觉得怎么样?

4 个答案:

答案 0 :(得分:12)

修改

我根据您的问题编辑完全改写了我的答案。

让我向您展示使用最少的步骤实现插件架构是多么容易。

第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
  • 中运行您的插件
  • 选择接口,抽象类或属性以使用
  • 装饰插件
  • 使用反射,接口,IL发出的thunk或委托来完成后期绑定工作

如果你的设计如此指示。

答案 1 :(得分:2)

将技术和架构视角分开是很有价值的:

  • 在代码级MEF(托管扩展性框架)是一个良好的开端。 Here就是一个简单的例子。
  • 任何其他DI(依赖注入框架)都可以很好地适用于(即Unity)

在建筑层面看到这个问题很好:

如果您阅读并尝试其中一些框架,我认为这是一种快速而有效的方法。如果你发现了令人感动的事情,ofcoz会阅读消息来源。

修改

如果您要搜索可扩展的博客引擎,请先尝试 Blog Engine 。它来自ASP.NET社区。

答案 2 :(得分:1)

这听起来像是微软Managed Extensibility Framework的工作。它目前处于预览版本中,但它似乎比滚动自己的框架更好。有关如何在网站上使用此功能的指南链接。

答案 3 :(得分:1)

如果您希望看到实现此体系结构的真实开源应用程序,请查看DotNetNuke