C# 原型对象和;“每图”;DI生命周期
我有一个C# 原型对象和;“每图”;DI生命周期,c#,.net-core,design-patterns,dependency-injection,simple-injector,C#,.net Core,Design Patterns,Dependency Injection,Simple Injector,我有一个Credentials类,应该通过依赖注入作为实例提供给所有需要它的构造函数。目前,我已经通过在DI容器中注册该类的一个实例解决了这个问题,该实例具有单例生命周期。这确保了每次DI调用时,所有对象都收到相同的凭据。这是可行的,但有点尴尬,因为凭证单例的属性在每次显式DI调用之间都会发生变化。这意味着每个收件人构造函数在更改凭据属性之前,必须立即从凭据实例“抓取并保存”凭据属性 如果我能让DI容器为每个图形或每个调用创建一个新的凭证实例,这会更好,它基于一个原型对象(是的,GOF“prot
Credentials
类,应该通过依赖注入作为实例提供给所有需要它的构造函数。目前,我已经通过在DI容器中注册该类的一个实例解决了这个问题,该实例具有单例生命周期。这确保了每次DI调用时,所有对象都收到相同的凭据。这是可行的,但有点尴尬,因为凭证
单例的属性在每次显式DI调用之间都会发生变化。这意味着每个收件人构造函数在更改凭据属性之前,必须立即从凭据实例“抓取并保存”凭据属性
如果我能让DI容器为每个图形或每个调用创建一个新的凭证
实例,这会更好,它基于一个原型对象(是的,GOF“prototype”模式)。我使用的是简单喷油器,因此我的第一个解决方案如下所示:
public static Credentials creds; //Implements ICloneable
//....
var prototypeTransientLifestyle = Lifestyle.CreateCustom(
name: "Prototype Transient",
// instanceCreator is of type Func<object>
lifestyleApplierFactory: instanceCreator =>
{
return () => creds.Clone();
});
现在我仍然希望有“每图”的行为。进一步阅读建议我需要使用一个简单的注射器Scope
。显然,这需要有一个调用DI容器的中心位置,以便显式创建范围。我的代码确实非常适合这样做,但我仍然想知道是否有其他方法可以实现“每图”,而不需要显式创建范围。正如文档中所述,Simple Injector没有“每图”生活方式的概念。相反,限定范围的生活方式提供了通常足够接近的行为
显然,这需要有一个调用DI容器的中心位置,以便显式创建范围
这是正确的。这个中心位置称为,每个应用程序都会有它
我仍然想知道是否有另一种实现“每图”的方法,它不需要显式地创建范围
简单的注入器GitHub存储库包含,但我的建议是坚持使用内置结构,即ScopedLifestyle
container.Register<Credentials>(() => (Credentials)creds.Clone());