IoC容器映射:单例与每次调用创建

时间:2015-12-10 13:35:48

标签: c# design-patterns dependency-injection ioc-container

让我们假设我们有一个非常简单的IConfiguration接口,负责返回正确的连接字符串

interface IConfiguration
{
   string ConnectionString {get;}
}

并假设只能使用实现此类接口的类型的一个实例(因为它只返回一个字符串,而不是管理状态等)。

因此,至少有两种方法可以在容器中注册接口:像往常一样 - 每个类型请求的新对象,或者作为单个 - 所有类型请求的一个对象。方法之间是否存在差异(可能是性能原因,终身管理技巧等)

container.For<IConfiguration>().Use<ConfigurationImpl>();

VS

container.For<IConfiguration>().Singleton().Use<ConfigurationImpl>();

1 个答案:

答案 0 :(得分:4)

使用DI容器的对象生命周期管理通常归结为:

  1. Singleton范围(有时是容器范围)
  2. 瞬态(根据集装箱的要求)
  3. 每个图表(上下文)(例如:桌面应用程序中的演示者/控制器,Web应用程序/ Web服务器中的会话)
  4. 我恳请你阅读Mark Seemanns优秀的书Dependency Injection in .Net.它有专门讨论对象生命周期管理的章节。

    一般来说,对于瞬态而言,你是线程安全的,而单例是出于性能原因或状态共享的好处。您还必须仔细记录资源的处理方式。

    如果你有一个框架意味着一些设计,你可以使用这个框架的一部分作为实例生命周期的上下文。

    示例:asp mvc控制器使用了2个db命令,因此可以通过使dbsession生命周期与控制器生命周期相关联来共享它们之间的dbsession。

    有更多的方法可以管理对象的生命周期 - 比如池化,延迟加载或期货,但它们的使用率比前三个要少得多。请阅读Mark Seemann。