c# - 如何实现 PerGraph 生活方式

标签 c# .net dependency-injection simple-injector object-lifetime

根据Simple Injector documentation ,存在 Per Graph 生活方式,可用于将对象的范围限制为当前图表。但文档没有列出实现它实际需要做什么,而且我在网上找不到任何有关如何使用它的文档。注册对象时如何定义对象的 Per Graph 范围?

我本以为:

container.Register<ISomeType, SomeType>(Lifestyle.PerGraph);

会存在,但默认情况下不存在。

最佳答案

文档指出:

This lifestyle can be simulated by using one of the Scoped lifestyles.

换句话说,Simple Injector 不包含开箱即用的 PerGraph 生活方式(文档对此并没有明确说明,因此可能需要稍微改进)。诀窍是选择适当的范围生活方式(取决于您的要求)并(隐式或显式)启动范围并解析图表。例如:

var scopedLifestyle = new AsyncScopedLifestyle();

container.Register<ISomeType, SomeType>(scopedLifestyle);

using (AsyncScopedLifestyle.BeginScope(container))
{
    var some = container.GetInstance<SomeRootObjectDependingOnSomeType>();
    some.Execute();
}

简单注入(inject)器中不存在每图生活方式的主要原因是它可能非常不可靠。如果部分图的构建被延迟(例如,由于使用 Lazy、Func 或回调容器),这会导致生成一个新图,并因此产生一个新的 per图表实例。这很容易被忽略,而且 Simple Injector diagnostic services 是不可能的。对此发出警告。因此,自己明确定义范围会更安全、更清晰。

关于c# - 如何实现 PerGraph 生活方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28834216/

相关文章:

c# - 将相机名称映射到 opencv 相机索引

php - Zend\Di\Di 定义和内存

c# - 如何注册ServiceBusClient进行依赖注入(inject)?

java - 一个 bean 中的作用域单例以及其他依赖 bean 的原型(prototype)

c# - 如何知道变量是否包含整数或字符串?

c# - 捕获具有特定错误代码的 oledb 异常

c# - 有没有办法让 SqlConnection 在关联的 DataReader 打开时写入?

c# - 如何在 WPF 中禁止退格键

c# - 在 Debug模式下单步执行时跳过方法的属性

c# - 如何将以字节为单位接收图像的对象转换为实际图像?