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

IoC container mappings: singleton vs each-call creation

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

interface IConfiguration
{
   string ConnectionString {get;}
}

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

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

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

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

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

  1. 单例范围(有时是容器范围)
  2. 瞬态(根据容器的请求)
  3. 每个图(上下文)(示例:presenter/controller 在桌面应用程序中,会话在 Web applications/web 服务器中)

我强烈建议你阅读 Mark Seemanns 的好书Dependency Injection in .Net.它有专门的章节专门介绍对象生命周期管理。

一般来说,您对瞬态是线程安全的,单例出于性能原因或状态共享是好的。您还必须仔细注意您的资源是如何处理的。

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

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

有更多的方法来管理对象生命周期——比如池化、延迟加载或未来,但它们比前 3 种使用得少。请阅读 Mark Seemann 了解相关内容。