У меня есть ведущий, который принимает Услугу и вид договора в качестве параметров в его конструктор:Dependency Injection для Presenter
public FooPresenter : IFooPresenter {
private IFooView view;
private readonly IFooService service;
public FooPresenter(IFooView view, IFooService service) {
this.view = view;
this.service = service;
}
}
Я решаю свою службу с Autofac:
private ContainerProvider BuildDependencies() {
var builder = new ContainerBuilder();
builder.Register<FooService>().As<IFooService>().FactoryScoped();
return new ContainerProvider(builder.Build());
}
В моей странице ASPX (Просмотреть реализацию):
public partial class Foo : Page, IFooView {
private FooPresenter presenter;
public Foo() {
// this is straightforward but not really ideal
// (IoCResolve is a holder for how I hit the container in global.asax)
this.presenter = new FooPresenter(this, IoCResolve<IFooService>());
// I would rather have an interface IFooPresenter so I can do
this.presenter = IoCResolve<IFooPresenter>();
// this allows me to add more services as needed without having to
// come back and manually update this constructor call here
}
}
Проблема заключается в том, что конструктор FooPresenter ожидает конкретную страницу, а не для контейнера для создания нового.
Могу ли я предоставить конкретный экземпляр представления текущей страницы в контейнер только для этого разрешения? Имеет ли смысл делать это, или я должен делать это по-другому?
Отличное решение. Спасибо, что указали это. До сих пор я до сих пор не разбирал сгенерированные фабрики. –
Я работаю над тем, как это сделать на абстрактном уровне. Моя текущая структура позволяет просматривать виды с помощью '[Presenter (typeof (FooPresenter))]' (поэтому код разрешения шаблона исключается). С сгенерированными фабриками я не буду знать, какой конкретный тип фабрики разрешить без дополнительных метаданных. Я, вероятно, буду использовать 'builder.RegisterGeneratedFactory>();' за расширением метода 'RegisterPresenter ', который обнаруживает тип вида через отражение. В любом случае, спасибо за вдохновение! –
Вы также можете попробовать мой образец заводской фабрики (ссылка на статью в моем примере). Вам нужно будет зарегистрировать только одну фабрику, которая может динамически создавать любого презентатора. Должно быть даже возможно связать это с вашим атрибутом Presenter, минимизирующим как код разрешения шаблона, так и конфигурацию контейнера. –