Предположим, что у меня есть эта строка в моем ботстрап-коде:
builder.RegisterType<MyType>().As<IMyType>().As<IMyTypeBase>().ExternallyOwned();
Я хочу, чтобы всякий раз, когда я использую container.Resolve<IMyType>()
я получаю новый экземпляр MyType
. Однако, если я использую container.Resolve<IEnumerable<IMyTypeBase>>()
, я не хочу новых экземпляров. Я хочу, чтобы все экземпляры уже были созданы. Возможно ли это с помощью Autofac?
Ваше требование кажется противоречивым, и вы должны пересмотреть свою стратегию. Поведение, которое вы хотите, может привести к очень неожиданным результатам и определить порядок, в котором типы разрешены или даже в каком порядке заказываются параметры конструктора.
Взгляните на следующий пример:
var instance1 = container.Resolve<IMyType>();
var instance2 = container.Resolve<IEnumerable<IMyTypeBase>>().First();
Assert.AreSame(instance1, instance2);
Здесь мы сначала разрешаем IMyType
и позже разрешаем IMyTypeBase
экземпляров 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
. И вы можете увидеть это в этом конкретном случае, но поскольку графы объектов могут стать очень глубокими, становится практически невозможно угадать количество экземпляров MyType
которые будут созданы.