【问题标题】:How To Implement PerGraph Lifestyle如何实现 PerGraph 生活方式
【发布时间】:2015-03-03 14:23:57
【问题描述】:
根据Simple Injector documentation,存在 Per Graph 生活方式,可用于将对象的范围限制为当前图。但是文档没有列出实现它实际需要做的事情,而且我在网上找不到任何关于如何使用它的文档。注册对象时如何定义 Per Graph 范围?
我本来以为:
container.Register<ISomeType, SomeType>(Lifestyle.PerGraph);
会存在,但默认情况下不存在。
【问题讨论】:
标签:
c#
.net
dependency-injection
simple-injector
object-lifetime
【解决方案1】:
文档说明:
可以使用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、Func 或对容器的回调),这将导致一个新的图,因此一个新的 per图 实例。这很容易被忽略,Simple Injector diagnostic services 不可能对此发出警告。因此,自己显式定义范围会更安全、更清晰。