根据Simple Injector documentation,存在“每图”生活方式,该生活方式可用于将对象的作用域限制为当前图。但是文档没有列出实现它的实际需要做的事情,而且我找不到在线有关如何使用它的文档。注册对象时如何为对象定义每图范围?

我本以为:

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


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

最佳答案

该文档指出:


  可以使用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 或对容器的调用),则会生成新图,因此会生成新的每个图实例。这很容易遗漏,Simple Injector diagnostic services无法对此发出警告。因此,自己明确定义范围会更安全,更清晰。

10-02 18:38