我正在開發ASP.Net MVC中的即插即用框架,從而可以將模塊定義爲與主項目分離的項目。因此,開發人員可以根據需要創建任意數量的模塊。動態實例化類c#
我需要的是能夠更新任何此類模塊的設置。爲此,在主項目中,我爲一些常用設置定義了基類,並且每個模塊都有自己的自定義設置。當模塊上有任何編輯時,我必須在主項目中實例化該模塊的實例。但是,主項目並不知道任何模塊。
我該如何做到這一點?
謝謝!
我正在開發ASP.Net MVC中的即插即用框架,從而可以將模塊定義爲與主項目分離的項目。因此,開發人員可以根據需要創建任意數量的模塊。動態實例化類c#
我需要的是能夠更新任何此類模塊的設置。爲此,在主項目中,我爲一些常用設置定義了基類,並且每個模塊都有自己的自定義設置。當模塊上有任何編輯時,我必須在主項目中實例化該模塊的實例。但是,主項目並不知道任何模塊。
我該如何做到這一點?
謝謝!
根據您的需要,您將不得不創建一個依賴於接口的解決方案。
本質上,應用程序公開了一個名爲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
}
感謝您的解決方案。但是,它部分解決了我的問題。我仍然不確定主項目如何將對象傳遞給Run(),以便每個模塊都可以對對象值採取適當的操作(如更新DB等中的值)? – annantDev
您可以使用依賴注入並將這些模塊注入到組合根的應用程序中。根據配置,您可以使用代碼或xml(配置文件)。您可以根據自己真正需要的情況進行自動佈線,延遲綁定等。
您也可以在初始化每個模塊。所以每當你註冊一個模塊,它應該初始化註冊模塊和依賴注入等
你能否給我提供一個這樣做的例子鏈接?現在任何國際奧委會的例子都應該沒問題。一旦我有了一個想法,我總是可以根據我將要使用的IOC來改變它。 – annantDev
你如何熟悉與反思? –
這聽起來像是團結或spring.net(依賴注入)框架的工作 – deostroll