2013-12-19 76 views
3

我有一個管理器類,通過反射來加載包含在單獨程序集中的各種插件模塊。這些模塊是與外部世界的通信(WebAPI,各種其他網絡協議)。如何將依賴關係注入動態加載的程序集

public class Manager 
{ 
    public ILogger Logger; // Modules need to access this. 

    private void LoadAssemblies() 
    { 
    // Load assemblies through reflection. 
    } 
} 

這些插件模塊必須與管理器類中包含的對象進行通信。我怎樣才能實現這個?我想過使用依賴注入/ IoC容器,但我怎樣才能在組件上做到這一點?

另一個想法,我不感到興奮,是讓模塊引用一個包含他們需要的資源的靜態類。

我欣賞任何建設性的意見/建議。

+0

你如何實例化這些插件的實例?他們是否實現了一個或多個接口? – qujck

回答

0

大多數ioc容器應該支持這個。例如,autofac你可以這樣做:

// in another assembly 
class plugin { 
    // take in required services in the constructor 
    public plugin(ILogger logger) { ... } 
} 

var cb = new ContainerBuilder(); 

// register services which the plugins will depend on 
cb.Register(cc => new Logger()).As<ILogger>(); 

var types = // load types 
foreach (var type in types) { 
    cb.RegisterType(type); // logger will be injected 
} 

var container = cb.Build(); 
// to retrieve instances of the plugin 
var plugin = cb.Resolve(pluginType); 

根據您的應用程序的其餘部分將如何調用該插件,你可以適當地改變註冊(例如用AsImplementedInterfaces註冊()由已知的接口來獲取插件或鍵控以通過某個關鍵對象(例如字符串)檢索插件)。

+0

我會如何與Ninject完成此項工作? – joek1975

+0

@downvoter爲什麼downvote? – ChaseMedallion