Con qualche aiuto gentile da StackOverflow, ho Unità Framework per creare le mie dipendenze incatenati, tra cui un Entity Framework DataContext oggetto:Unità quadro - la creazione e lo smaltimento datacontexts Entity Framework al momento opportuno
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>();
questo funziona davvero bene nella creazione del mio oggetto Presenter e visualizzando la vista correlata, sono davvero contento.
Tuttavia, il problema in cui mi sto imbattendo ora è il momento della creazione e dell'eliminazione dell'oggetto Entity Framework (e ho il sospetto che ciò avvenga per qualsiasi oggetto IDisposable). Con Unity come questo, l'oggetto "CommunergySQLiteEntities" SQL EF è creato subito, come ho aggiunto la sua interfaccia, IUnitOfWork al costruttore della MeterPresenter
public MeterPresenter(IMeterView view, IUnitOfWork unitOfWork, IRepositoryFactory cacheRepository)
{
this.mView = view;
this.unitOfWork = unitOfWork;
this.cacheRepository = cacheRepository;
this.Initialize();
}
mi sentivo un po 'a disagio su questo, al momento, dato che non voglio mantenere aperta una connessione al database, ma non ho potuto vedere in nessun altro modo usando l'iniezione della dipendenza Unity. Abbastanza sicuro, quando in realtà cerco di usare il DataContext, ottengo questo errore:
((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}
La mia comprensione del principio di IoC è che si imposta tutte le dipendenze in alto, risolvere il vostro oggetto e si va via . Tuttavia, in questo caso, alcuni degli oggetti figlio, ad esempio il datacontext, non devono essere inizializzati nel momento in cui viene creato l'oggetto padre Presenter (come si farebbe passandoli nel costruttore), ma il Presenter deve sapere quale tipo utilizzare per IUnitOfWork quando vuole parlare con il database.
Idealmente, voglio qualcosa di simile dentro il mio presentatore ha deliberato:
using(IUnitOfWork unitOfWork = new NewInstanceInjectedUnitOfWorkType())
{
//do unitOfWork stuff
}
Così il presentatore sa cosa IUnitOfWork applicazione da utilizzare per creare e smaltire subito, preferibilmente dalla chiamata RegisterType originale. Devo mettere un altro contenitore Unity all'interno del mio Presenter, a rischio di creare una nuova dipendenza?
Questo è probabilmente molto ovvio per un guru IoC, ma apprezzerei davvero un puntatore nella giusta direzione.
Ciao Aaron - tu e Michael avevate ragione entrambi, era quel piccolo giocherellone ContainerControlledLifetimeManager che avevo in giro da una versione precedente. L'ho rimosso, tornato ad avere IUnitOfWork nel costruttore di Presenter, e sembra abbastanza felice. grazie a tutti, molto istruttivo ... – TobyEvans
e la ragione per cui l'avevo in primo luogo era questa domanda: http://stackoverflow.com/questions/2412563/unity-framework-reusing-instance Tuttavia, I 've ora è cambiato il mio disegno di utilizzare una fabbrica per creare i miei repository, e il metodo di fabbrica prende l'IUnitOfWork come parametro: var = localcache cacheRepository.CreateRealtimeRepository (unitOfWork) quindi non ho bisogno di avere la ContainerControlledLifetimeManager Come ho detto, molto educativo ... – TobyEvans