Mi código hará referencia a Microsoft la unidad, pero estoy seguro de que es bastante aplicable a todos los marcos de DI. Si está usando DI correctamente, nunca necesita llamar a un nuevo BusinessObject (new dataContext), la asociación DI lo manejará todo por usted.
Mi ejemplo será un poco largo ya que pegaré en algún código que uso para ejecutar un sitio web de Model View Presenter completamente descargado por Unity. (Si desea que el código fuente completo echa un vistazo a mi blog y descargarlo desde mi servidor Assembla SVN)
carga del contenedor (puede estar en código como prefiero o el uso de la configuración)
protected void Application_Start(object sender, EventArgs e)
{
Application.GetContainer()
// presenters/controllers are per request
.RegisterType<IEmployeeController, EmployeeController>(new ContextLifetimeManager<IEmployeeController>())
//Data Providers are Per session
.RegisterType<IEmployeeDataProvider, EmployeeDataProvider>(new SessionLifetimeManager<IEmployeeDataProvider>())
//Session Factory is life time
.RegisterType<INHibernateSessionManager, NHibernateSessionManager>(new ContainerControlledLifetimeManager());
}
HTTP personalizados llamadas de módulo Método Unity BuildUp para cada página durante la invocación OnPreRequest.
private static void OnPreRequestHandlerExecute(object sender, EventArgs e)
{
var handler = HttpContext.Current.Handler;
HttpContext.Current.Application.GetContainer().BuildUp(handler.GetType(), handler);
// User Controls are ready to be built up after the page initialization is complete
var page = HttpContext.Current.Handler as Page;
if (page != null)
{
page.InitComplete += OnPageInitComplete;
}
}
presentador contenedor Página decorado con [Dependencia] atributo
public partial class Employees : Page, IEmployeeView
{
private EmployeePresenter _presenter;
[Dependency]
public EmployeePresenter Presenter
{
set
{
_presenter = value;
_presenter.View = this;
}
}
}
Presentador con el método InjectionConstructor
public class EmployeePresenter : Presenter<IEmployeeView>
{
private readonly IEmployeeController _controller;
[InjectionConstructor]
}
public EmployeePresenter(IEmployeeController controller)
{
_controller = controller;
}
controlador sigue el juego
public class EmployeeController : IEmployeeController
{
private readonly IEmployeeDataProvider _provider;
[InjectionConstructor]
public EmployeeController(IEmployeeDataProvider DataProvider)
{
_provider = DataProvider;
}
}
mismo con Pro vider
public class EmployeeController : IEmployeeController
{
private readonly IEmployeeDataProvider _provider;
[InjectionConstructor]
public EmployeeController(IEmployeeDataProvider DataProvider)
{
_provider = DataProvider;
}
}
Por último, el administrador de sesión, que contiene solo un constructor común.
public class NHibernateSessionManager : INHibernateSessionManager
{
private readonly ISessionFactory _sessionFactory;
public NHibernateSessionManager()
{
_sessionFactory = GetSessionFactory();
}
}
Entonces, ¿qué sucede cuando una solicitud de página se inicia la acumulación método() se llama en la página por el HttpModule. A continuación, Unity ve la propiedad marcada con el atributo Dependencia y verificará su contenedor para ver si existe dentro de él un objeto EmployeePresenter.
Como no hay tal objeto en el contenedor, intentará crear un EmployeePresenter. Después de la inspección para crear la clase que ve dentro del Presentador, se requiere un constructor que necesita un IEmployeeController inyectado en él. Como el contenedor en realidad tiene un administrador para el controlador, verá si existe una instancia en el contenedor que al inicio de la solicitud de página no existe, por lo que se utilizará para crear una instancia del controlador.
Unity verá que el controlador requiere un IEmployeeDataProvider inyectado en él, y continuará en este proceso hasta que finalmente llegue al punto donde el Proveedor necesita la inyección del administrador de sesión. Como el administrador de sesión ya no necesita inyectarse, Unity creará una instancia del gestor de sesión, lo almacenará en el contenedor para el contenedor ContainerLifeTimeManager, lo inyectará en el proveedor y lo almacenará, y así sucesivamente hasta que termine de crear un archivo. Dependencia de EmployeePresenter para la página.
Bueno, si utiliza la palabra clave "nueva" directamente en lugar de solicitar el objeto, no está utilizando la inyección de dependencia. –
@Pop, estás pensando en un marco DI, no en el patrón. En DI el patrón, inyectar una instancia de la clase de la que dependas en un constructor es perfectamente razonable. Otra forma es hacerlo a través de propiedades. – tvanfosson
@Pop Catalin: este es un ejemplo de DI. La instancia del objeto que se inyectará es el "IDataContext", no los "BusinessProducts". – Owen