Aquí es lo que hago:
En primer lugar, definir las tesis interfaces:
public interface IView<TPresenter>
{
TPresenter Presenter { get; set; }
}
public interface IPresenter<TView, TPresenter>
where TView : IView<TPresenter>
where TPresenter : IPresenter<TView, TPresenter>
{
TView View { get; set; }
}
Entonces esta clase presentador abstracta:
public abstract class AbstractPresenter<TView, TPresenter> : IPresenter<TView, TPresenter>
where TView : IView<TPresenter>
where TPresenter : class, IPresenter<TView, TPresenter>
{
protected TView view;
public TView View
{
get { return this.view; }
set
{
this.view = value;
this.view.Presenter = this as TPresenter;
}
}
}
La vista se inyecta a través de una propiedad, en lugar del constructor, para permitir el afecto bidireccional en el colocador. Tenga en cuenta que se necesita un molde segura ...
Entonces, mi presentadora concreto es algo así como:
public class MyPresenter : AbstractPresenter<IMyView, MyPresenter>
{
//...
}
Dónde IMyView
implementa IView
. Existe una necesidad concreta tipo de vista (por ejemplo MyView
), pero es el contenedor que lo resuelve:
- me registro
MyPresenter
tipo como él mismo en el contenedor, con un comportamiento transitorio.
- Registré
MyView
como IMyView
en el contenedor con un comportamiento transitorio.
- Luego solicito un
MyPresenter
en el contenedor.
- Container instanciar un MyView
- Se instanciates un
MyPresenter
- Se inyectar la vista en el presentador a través de la propiedad
AbstractPresenter.View
.
- El código colocador completa la bi-direccional asociación
- El contenedor devuelve el par Presentador/Ver
Se le permite inyectar otras dependencias (servicios, repos) en tanto que su punto de vista y su presentador. Pero en el escenario que describió, le recomiendo que inyecte servicios y cachés en el presentador , en lugar de la vista.
¿Cómo manejas las preocupaciones IDisposable? En particular, ¿romper referencias circulares para permitir la recolección de basura? – aboy021