Ich habe einen Presenter, der einen Service und einen View Contract als Parameter in seinem Konstruktor nimmt:
public FooPresenter : IFooPresenter {
private IFooView view;
private readonly IFooService service;
public FooPresenter(IFooView view, IFooService service) {
this.view = view;
this.service = service;
}
}
Ich wickle meinen Service mit Autofac ab:
private ContainerProvider BuildDependencies() {
var builder = new ContainerBuilder();
builder.Register<FooService>().As<IFooService>().FactoryScoped();
return new ContainerProvider(builder.Build());
}
In meiner ASPX-Seite (View-Implementierung):
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
}
}
Das Problem ist, dass der Konstruktor von FooPresenter die spezifische Seite erwartet und nicht, dass der Container eine neue Seite erstellt.
Kann ich dem Container eine bestimmte Instanz der Ansicht, die aktuelle Seite, nur für diese Auflösung zur Verfügung stellen? Ist das sinnvoll, oder sollte ich das anders machen?