如何实现PerGraph生活方式

时间:2015-03-03 14:23:57

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

根据Simple Injector documentation,存在Per Graph生活方式,可用于将对象的范围限制为当前图形。但是文档没有列出实现它的实际需要,我无法在线找到有关如何使用它的任何文档。如何在注册对象时为对象定义每个图形范围?

我原以为:

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

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

1 个答案:

答案 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不可能对此发出警告。因此,自己明确定义范围更加安全和清晰。