Con un poco de ayuda bondadosa de stackoverflow, tengo Marco de la Unidad para crear mis dependencias encadenados, incluyendo un marco de la entidad objeto DataContext:marco de la Unidad - la creación y eliminación datacontexts de Entity Framework en el momento apropiado
using (IUnityContainer container = new UnityContainer())
{
container.RegisterType<IMeterView, Meter>();
container.RegisterType<IUnitOfWork, CommunergySQLiteEntities>(new ContainerControlledLifetimeManager());
container.RegisterType<IRepositoryFactory, SQLiteRepositoryFactory>();
container.RegisterType<IRepositoryFactory, WCFRepositoryFactory>("Uploader");
container.Configure<InjectedMembers>()
.ConfigureInjectionFor<CommunergySQLiteEntities>(
new InjectionConstructor(connectionString));
MeterPresenter meterPresenter = container.Resolve<MeterPresenter>();
este funciona muy bien al crear mi objeto Presenter y mostrar la vista relacionada. Estoy realmente contento.
Sin embargo, el problema con el que me estoy encontrando ahora es sobre el tiempo de creación y eliminación del objeto Entity Framework (y sospecho que esto irá para cualquier objeto IDisposable). El uso de la Unidad de esta manera, el objeto "CommunergySQLiteEntities" SQL EF se crea de inmediato, ya que he añadido su interfaz, IUnitOfWork al constructor de la MeterPresenter
public MeterPresenter(IMeterView view, IUnitOfWork unitOfWork, IRepositoryFactory cacheRepository)
{
this.mView = view;
this.unitOfWork = unitOfWork;
this.cacheRepository = cacheRepository;
this.Initialize();
}
me sentí un poco incómodo con esto en el momento, ya que no quiero mantener abierta una conexión de base de datos, pero no pude ver de otra manera el uso de la inyección de dependencia de Unity. Efectivamente, cuando en realidad intenta utilizar el DataContext, me sale este error:
((System.Data.Objects.ObjectContext)(unitOfWork)).Connection
'((System.Data.Objects.ObjectContext)(unitOfWork)).Connection'
threw an exception of type 'System.ObjectDisposedException'
System.Data.Common.DbConnection {System.ObjectDisposedException}
Mi comprensión del principio de la COI es que configure todas sus dependencias en la parte superior, resolver su objetivo y ya está . Sin embargo, en este caso, algunos de los objetos secundarios, por ejemplo, el contexto de datos, no necesitan inicializarse en el momento en que se crea el objeto padre Presenter (como lo haría al pasarlos en el constructor), pero el presentador necesita saber qué tipo usar para IUnitOfWork cuando quiere hablar con la base de datos.
Idealmente, quiero algo como esto dentro de mi Presentador resuelto:
using(IUnitOfWork unitOfWork = new NewInstanceInjectedUnitOfWorkType())
{
//do unitOfWork stuff
}
Así que el presentador sabe lo IUnitOfWork aplicación a utilizar para crear y disponer de inmediato, preferiblemente de la llamada RegisterType originales. ¿Tengo que poner otro contenedor de Unity dentro de mi Presentador, a riesgo de crear una nueva dependencia?
Esto es probablemente muy obvio para un gurú de IoC, pero realmente agradecería un apuntador en la dirección correcta.
Hola Aaron: Michael y tú tenéis razón, fue ese pequeño y travieso ContainerControlledLifetimeManager que tuve de una versión anterior. Lo eliminé, volví a tener IUnitOfWork en el constructor de Presenter, y parece bastante feliz. gracias a todos, muy educativo ... – TobyEvans
y la razón por la que tuve que en primer lugar fue esta pregunta: http://stackoverflow.com/questions/2412563/unity-framework-reusing-instance Sin embargo, yo 've ahora cambiado mi diseño de utilizar una fábrica para crear mis repositorios, y el método de fábrica toma el IUnitOfWork como el parámetro: var = LocalCache cacheRepository.CreateRealtimeRepository (UnitOfWork) así que no es necesario tener la ContainerControlledLifetimeManager Como dije, muy educativo ... – TobyEvans