autofacc可以对每个接口执行不同的实例作用域吗?



假设我的bootstrap代码中有这样一行:

builder.RegisterType<MyType>().As<IMyType>().As<IMyTypeBase>().ExternallyOwned();

我希望每当我使用container.Resolve<IMyType>()时,我都会得到MyType的一个新实例。然而,如果我使用container.Resolve<IEnumerable<IMyTypeBase>>(),我不想要新的实例。我想要所有已经创建的实例。这是可能的autoface吗?

您的需求似乎相互冲突,您应该重新考虑您的策略。您想要的行为可能导致非常令人惊讶的结果,并决定类型解析的顺序,甚至构造函数参数的顺序。

请看下面的例子:

var instance1 = container.Resolve<IMyType>();
var instance2 = container.Resolve<IEnumerable<IMyTypeBase>>().First();
Assert.AreSame(instance1, instance2);

在这里,我们首先解析IMyType,然后解析IMyTypeBase实例集合,您希望该集合返回相同的实例。但如果我们能扭转局面呢?

var instance2 = container.Resolve<IEnumerable<IMyTypeBase>>().First();
var instance1 = container.Resolve<IMyType>();

你仍然期望两个实例是相同的吗?当Resolve<IEnumerable<IMyTypeBase>>()被调用时,还没有MyType实例,所以它将被创建。但是您的要求是在解析IMyType时总是创建一个新实例,因此在本例中将创建两个实例。

更糟糕的是,看看下面两个构造函数:

public SomeService(IMyType type, IEnumerable<IMyTypeBase> types) { ... }
public OtherService(IEnumerable<IMyTypeBase> types, IMyType type) { ... }

OtherService首先定义了IEnumerable<IMyTypeBase>参数,这一简单的事实将导致创建两个MyType实例。在这种特殊情况下,你可能会看到这一点,但由于对象图可以变得非常深入,因此几乎不可能猜测要创建的MyType实例的数量。

相关内容

  • 没有找到相关文章

最新更新