Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 原型对象和;“每图”;DI生命周期_C#_.net Core_Design Patterns_Dependency Injection_Simple Injector - Fatal编程技术网

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());