根据Simple Injector documentation,存在Per Graph生活方式,可用于将对象的范围限制为当前图形。但是文档没有列出实现它的实际需要,我无法在线找到有关如何使用它的任何文档。如何在注册对象时为对象定义每个图形范围?
我原以为:
container.Register<ISomeType, SomeType>(Lifestyle.PerGraph);
会存在,但默认情况下不存在。
答案 0 :(得分:3)
文档说明:
可以使用Scoped生活方式中的一种来模拟这种生活方式。
换句话说,Simple Injector不包含开箱即用的PerGraph生活方式(文档对此没有明确的说明,因此可能需要稍微改进一下)。诀窍是选择适当的范围生活方式(取决于您的要求)和(隐式或显式)启动范围并解析图形。例如:
var scopedLifestyle = new AsyncScopedLifestyle();
container.Register<ISomeType, SomeType>(scopedLifestyle);
using (AsyncScopedLifestyle.BeginScope(container))
{
var some = container.GetInstance<SomeRootObjectDependingOnSomeType>();
some.Execute();
}
Simple Injector中不存在每个图形生活方式的主要原因是因为它可能非常不可靠。如果图的一部分的构建被延迟(例如由于使用了Lazy&lt; T&gt;,Func&lt; T&gt;或者回调到容器中),则会产生新的图形,因此产生新的图实例。这很容易被遗漏,Simple Injector diagnostic services不可能对此发出警告。因此,自己明确定义范围更加安全和清晰。