我正在开发ASP.Net MVC中的即插即用框架,我可以将模块定义为Main项目中的独立项目。因此,开发人员可以根据需要创建任意数量的模块。
我需要的是能够更新任何此类模块的设置。为此,在主项目中,我为一些常见设置定义了一个基类,每个模块都有自己的自定义设置。当模块上有任何编辑时,我必须在主项目中实例化该模块的实例。但是,主要项目不了解任何模块。
我如何实现这一目标?
谢谢!
答案 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(配置文件)。你可以根据你真正需要的东西做自动接线,后期装订等。
您还可以在每个模块中使用初始化程序,因此无论何时注册模块,它都应初始化已注册的模块并注入依赖项等。