首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原型对象与“每个图”DI生命周期

原型对象与“每个图”DI生命周期
EN

Stack Overflow用户
提问于 2020-11-17 17:25:37
回答 1查看 36关注 0票数 0

我有一个Credentials类,它应该通过依赖注入作为一个实例提供给所有需要它的构造函数。目前,我已经通过将类的单个实例注册到我的DI容器中来解决这个问题,并使用了单例生命周期。这确保了每次DI调用时,所有对象都接收相同的凭据。这是可行的,但有点尴尬,因为Credentials单例的属性在每个显式DI调用之间都会发生变化。这意味着每个收件人构造函数必须立即从Credentials实例“获取并保存”凭据属性,然后更改它们。

如果我能够让DI容器根据原型对象(是的,GOF " prototype“模式)创建一个新的Credentials实例(每次图或每次调用),那么这样做会更好。我使用的是简单喷射器,所以我的第一个解决方案如下所示:

代码语言:javascript
复制
public static Credentials creds; //Implements ICloneable

//....

var prototypeTransientLifestyle = Lifestyle.CreateCustom(
    name: "Prototype Transient",
    // instanceCreator is of type Func<object>
    lifestyleApplierFactory: instanceCreator =>
    {
        return () => creds.Clone();
    });

我认为这是可行的,但即使如此,它也有两个弱点。首先,它只能应用于我的Credentials类。我希望它是通用的可重用的。第二,它在单个显式DI调用中创建潜在的多个克隆。我希望它有“每个图”的生命周期,以便它只创建一次克隆,并在DI调用的其余部分重复使用它。

对如何进行有什么想法吗?

顺便说一句,我知道“每个图”生命周期都存在与惰性评估相关的问题。我没有任何懒惰的评价,所以这不是一个问题。

更新

我想我对我的问题有一个部分的解决办法。为了以通用的方式实现原型克隆,我可以这样做:

代码语言:javascript
复制
container.Register<Credentials>(() => (Credentials)creds.Clone());

现在,我仍然希望有“每个图”的行为。进一步的阅读表明,我需要使用一个简单的注入器Scope。显然,这要求我有一个调用DI容器的中心位置,这样我就可以显式地创建范围。我的代码确实非常适合这样做,但我仍然在想,是否有另一种方法可以实现“每个图”,而不需要显式地创建作用域。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-17 19:04:42

作为文档中的注意到,Simple没有“每个图”生活方式的概念。相反,范围内的生活方式提供的行为通常是足够近的。

显然,这要求我有一个调用DI容器的中心位置,这样我就可以显式地创建范围。

这是正确的。这个中心位置称为成分根,每个应用程序都将拥有它。

我仍然在想,是否还有另一种方法可以实现“每个图”,而不需要显式地创建作用域。

简单的Injector GitHub存储库包含演示每个图形生活方式的代码示例,但我的建议是坚持内置结构,即ScopedLifestyle

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64880231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档