【发布时间】:2011-08-29 09:22:27
【问题描述】:
我阅读了许多关于在开发中使用 IoC 容器的有趣文章。在许多情况下,作者建议我们编写自己的简单包装器,该包装器隐藏读取容器的接口,如 Ninject、Castle.Windsor、Unity 等。
wrapper 的实现如下所示(对于 Ninject):
/// <summary>
/// Contains links for service contract and realization.
/// </summary>
public static class IoC
{
static readonly IKernel kernel;
static IoC()
{
kernel = new StandardKernel();
}
public static void RegisterService<T>(Type service)
{
kernel.Bind<T>().To(service);
}
public static T Resolve<T>()
{
return kernel.Get<T>();
}
}
好的,但是我怎样才能使用这种模式的高级功能呢?例如,我喜欢使用 InRequestScope() 或 InSingletonScope() 之类的终身管理修饰符,并且许多容器都支持相同的修饰符。使用上面的模式,我可以扔掉 ninject 并使用15-lines implementation。区别在哪里?
我还查看了 CommonServiceLocator 试图找到丰富的包装器,但它与我的 IoC 类没有太大区别。 现在我认为我不应该自己制造自行车并直接使用功能齐全的容器。那你呢?
【问题讨论】:
-
人们多久更换一次容器?真的那么普遍吗?无论如何,你的类不应该依赖于容器,所以替换它应该很容易,不管抽象与否,不是吗?
-
通常情况下,没有理由将您的 DI 容器抽象出来,因为无论如何您都应该只在组合根中使用它。其他所有内容都称为service locator anti-pattern,应该避免使用。
-
@R。 Martinho Fernandes:FWIW 我上周在一个较大的实时代码库中切换了容器,但承认这不是我每周每周都做的事情:)
标签: .net inversion-of-control ninject