动态实例化一个类c#

时间:2012-06-04 18:52:49

标签: c# asp.net-mvc-3

我正在开发ASP.Net MVC中的即插即用框架,我可以将模块定义为Main项目中的独立项目。因此,开发人员可以根据需要创建任意数量的模块。

我需要的是能够更新任何此类模块的设置。为此,在主项目中,我为一些常见设置定义了一个基类,每个模块都有自己的自定义设置。当模块上有任何编辑时,我必须在主项目中实例化该模块的实例。但是,主要项目不了解任何模块。

我如何实现这一目标?

谢谢!

2 个答案:

答案 0 :(得分:1)

根据您的需要,您必须创建依赖于接口的解决方案。

本质上,应用程序使用名为IModule的接口公开API dll。 IModule有一个名为Run()的方法。您的主应用程序将加载模块的程序集,查找实现IModule的内容,生成其中一个对象并在其上调用Run()。

这是一篇描述如何托管沙箱以在其中运行模块的旧文章。 http://msdn.microsoft.com/en-us/magazine/cc163701.aspx

namespace MyApplication.Api 
{
    public interface IModule
    { 
       void Run();
    }
}

开发人员会创建类似这样的东西

public class MyObject : MarshalByRefObject, IModule
{
    public void Run()
    {
        // do something here    
    }
}

应用程序将使用某种反射加载它。

public void LoadModule()
{
     var asm = System.Reflection.Assembly.Load(/* Get the developer module name from somewhere*/);
     var types = asm.GetExportedTypes();
     foreach(var t in types)
     {
         foreach(var i = t.GetInterfaces())
         {
             if(i == typeof(IModule))
             {
                 var iModule = System.Activator.CreateInstance(t);
                 iModule.Run();
             }
         }
     }
}

最好是在另一个appDomain中运行代码,但这会增加很多复杂性。

public void LoadModuleInAppDomain()
{
    // Spin up a new AppDomain

    // Load the assembly into the app domain

    // Get the object

    // Call the Run Method

}

答案 1 :(得分:1)

您可以使用依赖项注入并将这些模块注入组合根目录中的应用程序。根据配置,您可以使用代码或xml(配置文件)。你可以根据你真正需要的东西做自动接线,后期装订等。

您还可以在每个模块中使用初始化程序,因此无论何时注册模块,它都应初始化已注册的模块并注入依赖项等。