我们说我有一个IOC容器。我使用该容器注册具有单身生活方式的记录器:
var container = new Container();
container.Register<ILogger, Logger>(LifeStyle.Singleton);
现在当我使用这个单例时,只会为它创建一个实例。 但我的问题是,例如对于ASP.NET网站。这是整个应用程序为该一个用户使用的实例,还是每个用户访问我的网站的实例?
如果每个用户和记录器忙于记录某些内容而另一个用户也尝试记录某些内容,该怎么办?这会抛出错误吗? (我的意思是......记录器的最佳做法是什么?)
答案 0 :(得分:2)
Simple Injector文档states:
注册服务类型最多只有一个实例,容器将保留该实例,直到容器被处置或超出范围。客户端将始终从容器中接收相同的实例。 [...] Simple Injector保证Container实例中最多只有一个注册Singleton实例,但是如果创建了多个Container实例,每个Container实例将获得自己的注册Singleton实例。
Another part文档描述了:
您通常应该为整个应用程序创建一个Container实例(每个应用程序域一个实例);容器实例是线程安全的。
这意味着,由于您通常只创建一个容器实例, Singleton 注册将只有一个完整AppDomain实例。因此,每个用户和每个请求都将使用相同的实例。
您有责任确保此类实现是线程安全的,并且可以由多个线程并行使用。
如果您无法保证线程安全,则此类实例应注册为 Scoped 或 Transient 。
您应该查阅使用的日志记录库的文档,以确定该类型的实例是否是线程安全的。
不要在代码中注入第三方库抽象,而应考虑here所描述的替代设计。