我要尋找一個非常簡單,重量輕IoC容器其C#源可以包含在我自己的項目(因此不會外部參考)。項目 - 嵌入式IOC容器
原因是我正在編寫一個基礎架構,並希望提供一個.dll文件,而不需要任何額外的依賴關係。
我也不想ILMerge我與IOC大會總成..
我想到了MEF,其他一些建議嗎?
我要尋找一個非常簡單,重量輕IoC容器其C#源可以包含在我自己的項目(因此不會外部參考)。項目 - 嵌入式IOC容器
原因是我正在編寫一個基礎架構,並希望提供一個.dll文件,而不需要任何額外的依賴關係。
我也不想ILMerge我與IOC大會總成..
我想到了MEF,其他一些建議嗎?
這不是真的那麼難推出自己的容器,這取決於你所需要的功能類型。然而,這樣做很容易造成泄漏,所以我想你可能會想要使用經過測試和嘗試的解決方案。
MEF被某些人用作容器,但其他人則說MEF is not an IOC container,實質上MEF被設計成插件架構而不是依賴注入容器。
考慮到這一切,我會建議您在應用程序中嵌入您選擇的容器的完整源代碼,或使用工具將它的程序集合併到您自己的程序集中。 ILMerge是一個可以做到的工具,大多數商業混淆器都可以幫助你做到這一點。如果您正在構建商業圖書館或應用程序,我肯定會推薦使用適當的混淆器。
如果你不需要任何幻想,一個DI容器可真短:
public class Container
{
private readonly Dictionary<Type,Func<Container,object>> factories;
private readonly Dictionary<Type,object> cache;
public Container()
{
this.factories = new Dictionary<Type,Func<Container,object>>();
this.cache = new Dictionary<Type,object>();
}
public void Register<TContract>(Func<Container,TContract> factory)
{
// wrap in lambda which returns object instead of TContract
factories[typeof(TContract)] = c => factory(c);
}
public TContract Get<TContract>()
{
var contract = typeof(TContract);
if (!cache.ContainsKey(contract))
{
this.cache[contract] = this.factories[contract](this);
}
return (TContract)this.cache[contract];
}
}
,你會使用這樣的:
var container = new Container();
container.Register<ICar>(c => new Car(
c.Get<IEngine>(), c.Get<IWheel>()));
container.Register<IWheel>(c => new Wheel());
container.Register<IEngine>(c => new Engine());
var car = container.Get<ICar>();
更簡約是做的依賴無容器注射:
IWheel wheel = new Wheel();
IEngine engine = new Engine();
ICar car = new Car(engine, wheel);
但是,對於複雜的對象圖,它可以快速得到compli在重構期間保持正確的施工順序。容器沒有這個問題。
您可能想要標記此.net以獲取更多建議。 –
看看這個問題:http://stackoverflow.com/questions/2515124/whats-the-simplest-ioc-container-for-c有一個在線的例子 –
如果你正在編寫一個庫,你不應該完全可以使用DI容器:http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657 –