2012-06-04 161 views
1

我正在開發ASP.Net MVC中的即插即用框架,從而可以將模塊定義爲與主項目分離的項目。因此,開發人員可以根據需要創建任意數量的模塊。動態實例化類c#

我需要的是能夠更新任何此類模塊的設置。爲此,在主項目中,我爲一些常用設置定義了基類,並且每個模塊都有自己的自定義設置。當模塊上有任何編輯時,我必須在主項目中實例化該模塊的實例。但是,主項目並不知道任何模塊。

我該如何做到這一點?

謝謝!

+0

你如何熟悉與反思? –

+0

這聽起來像是團結或spring.net(依賴注入)框架的工作 – deostroll

回答

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 

} 
+0

感謝您的解決方案。但是,它部分解決了我的問題。我仍然不確定主項目如何將對象傳遞給Run(),以便每個模塊都可以對對象值採取適當的操作(如更新DB等中的值)? – annantDev

1

您可以使用依賴注入並將這些模塊注入到組合根的應用程序中。根據配置,您可以使用代碼或xml(配置文件)。您可以根據自己真正需要的情況進行自動佈線,延遲綁定等。

您也可以在初始化每個模塊。所以每當你註冊一個模塊,它應該初始化註冊模塊和依賴注入等

+0

你能否給我提供一個這樣做的例子鏈接?現在任何國際奧委會的例子都應該沒問題。一旦我有了一個想法,我總是可以根據我將要使用的IOC來改變它。 – annantDev