1

假设我的引导代码中有这一行:

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

我想要这样,每当我使用时,container.Resolve<IMyType>()我都会得到一个新的MyType. 但是,如果我使用container.Resolve<IEnumerable<IMyTypeBase>>(),我不想要新实例。我想要所有已经创建的实例。Autofac可以做到这一点吗?

4

1 回答 1

1

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

例如看下面的例子:

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要创建的实例的数量。

于 2014-05-23T14:17:46.233 回答