如何实现 PerGraph 生活方式

How To Implement PerGraph Lifestyle

根据 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 生活方式(文档对此并不十分明确,因此可能需要稍微改进)。诀窍是 select 适当的作用域生活方式(取决于您的要求)和(隐式或显式)启动作用域并解析图形。例如:

var scopedLifestyle = new AsyncScopedLifestyle();

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

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

Simple Injector 中不存在 per graph 生活方式的主要原因是它可能非常不可靠。如果部分图的构建被延迟(例如因为使用 Lazy、Func 或回调到容器中),这会产生一个新图,因此会产生一个新的 每个图 个实例。这很容易被忽略,Simple Injector diagnostic services 不可能对此发出警告。因此,自己显式定义作用域会更安全、更清晰。