我使用的是统一IOC容器和我只是想知道什么是最好的最好的方式接入容器,用于多种类。

应每一类有一个IUnityContainer成员,然后通过的容器的构造?应该有一个单独的类与IOC容器?

怎么样asp.net 发展?

可能有人引导我在正确的方向?谢谢。

有帮助吗?

解决方案 2

把IOC容器在工艺的最高水平/入口点,并用它来注入的一切依赖它的下面。

其他提示

IMHO它是不可取的整个容器注入一个类或具有广泛的应用的静态IoC的服务定位器。

您希望能够从一个类的构造函数看(让我们称之为它的Foo),它使用到完成工作,什么样的服务/对象。这提高了清晰度,可测试性和degubability。

可以说,富只需要电子邮件服务,但我通过在整个容器和地方在代码的电子邮件服务会从容器中得到解决。在这种情况下,这将是非常难以遵循。相反,它是不如直接注入的电子邮件服务声明Foo的依赖更清晰。

如果富需要创建的电子邮件服务的多个实例,最好是创建和注入一个EmailServiceFactory(通过IoC容器),这将在飞行创建所需的实例。

在后一种情况下,Foo的依赖关系仍指示存在尽可能具体 - 只有那些,该EmailServiceFactory可以创建。如果我注射了整个容器,它不会是清楚其所提供的服务是Foo的确切相关性。

现在,如果我以后要提供电子邮件服务的不同情况,我换出来的EmailServiceFactory内。我可以换出全厂为好,如果所有的服务,它创建需要被交换(例如测试期间)。

因此,在创建一个额外的类(工厂)的成本,我得到更清洁的代码,不会担心在使用全局静态可能发生的约好奇的bug。为测试提供嘲笑另外的时候,我确切地知道嘲笑它需要并没有模拟出整个容器的类型。

此方法还具有这样的优点,现在,当一个模块被初始化(仅适用于棱镜/模块化),它不具有注册的所有类型的对象的其与IoC容器提供的。相反,它可以只注册其的ServiceFactory其然后提供这些对象。

要明确的是,模块的初始化类(实现的IModule)应该仍然收到在其构造中应用广泛IoC容器以提供服务,由其他模块所消耗,但容器不应该侵入到模块的类。

最后,我们这里是什么额外的间接层如何解决问题的另一个很好的例子。

可以注册在自身的容器中,并把它注入像其他依赖属性,像这样:

IUnityContainer container = new UnityContainer();
container.RegisterInstance<IUnityContainer>(container);

这需要访问它将具有以下属性的类:

private IUnityContainer unityContainer;
[Dependency]
public IUnityContainer UnityContainer
{
    get { return unityContainer; }
    set { unityContainer = value; }
}

因此,每当这样的类的实例被解析/建立起来的容器被注入。

这是更灵活的,因为它适用于在同一应用程序内的多个容器中,这将是不可能的singleton图案。

如果你所有的物体需要在容器的引用,那么你应该考虑再处理一些代码。尽管仍然最好调用new到处仍散落在你的代码构建的对象图的责任。与一种用法它令我正在使用更像一个的ServiceLocator代替IOC容器。

另一种选择会使用的 CommonServiceLocator, 虽然它可能是一个毫无意义的间接,可以使用 ServiceLocator.Current 作为实例由所有已知类

我有我的博客这个问题,其中I'm使用沿着t3mujin答案东西线后。随意使用它(鸵鸟政策打扰这it's的SharePoint相关......这doesn't物质):

http://johanleino.spaces.live.com/blog /cns!6BE273C70C45B5D1!213.entry

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top