может ли Autofac выполнять различную область видимости для интерфейса?

1

Предположим, что у меня есть эта строка в моем ботстрап-коде:

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

Я хочу, чтобы всякий раз, когда я использую container.Resolve<IMyType>() я получаю новый экземпляр MyType. Однако, если я использую container.Resolve<IEnumerable<IMyTypeBase>>(), я не хочу новых экземпляров. Я хочу, чтобы все экземпляры уже были созданы. Возможно ли это с помощью Autofac?

Теги:
autofac

1 ответ

1
Лучший ответ

Ваше требование кажется противоречивым, и вы должны пересмотреть свою стратегию. Поведение, которое вы хотите, может привести к очень неожиданным результатам и определить порядок, в котором типы разрешены или даже в каком порядке заказываются параметры конструктора.

Взгляните на следующий пример:

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 которые будут созданы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню