我要寻找一个非常简单,重量轻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 –