让我们假设我们有一个非常简单的IConfiguration接口,负责返回正确的连接字符串
interface IConfiguration
{
string ConnectionString {get;}
}
并假设只能使用实现此类接口的类型的一个实例(因为它只返回一个字符串,而不是管理状态等)。
因此,至少有两种方法可以在容器中注册接口:像往常一样 - 每个类型请求的新对象,或者作为单个 - 所有类型请求的一个对象。方法之间是否存在差异(可能是性能原因,终身管理技巧等)
container.For<IConfiguration>().Use<ConfigurationImpl>();
VS
container.For<IConfiguration>().Singleton().Use<ConfigurationImpl>();
答案 0 :(得分:4)
使用DI容器的对象生命周期管理通常归结为:
我恳请你阅读Mark Seemanns优秀的书Dependency Injection in .Net.它有专门讨论对象生命周期管理的章节。
一般来说,对于瞬态而言,你是线程安全的,而单例是出于性能原因或状态共享的好处。您还必须仔细记录资源的处理方式。
如果你有一个框架意味着一些设计,你可以使用这个框架的一部分作为实例生命周期的上下文。
示例:asp mvc控制器使用了2个db命令,因此可以通过使dbsession生命周期与控制器生命周期相关联来共享它们之间的dbsession。
有更多的方法可以管理对象的生命周期 - 比如池化,延迟加载或期货,但它们的使用率比前三个要少得多。请阅读Mark Seemann。