С любезной помощью StackOverflow у меня есть Unity Framework для создания моих связанных зависимостей, включая объект Entity Framework datacontext:
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>();
это очень хорошо работает при создании объекта Presenter и отображении связанного с ним представления, я очень рад.
Однако проблема, с которой я сейчас сталкиваюсь, заключается в сроках создания и удаления объекта Entity Framework (и я подозреваю, что это пойдет на любой объект IDisposable). Используя Unity, подобный этому, объект SQL EF «CommunergySQLiteEntities» создается сразу, так как я добавил его интерфейс IUnitOfWork в конструктор MeterPresenter
public MeterPresenter(IMeterView view, IUnitOfWork unitOfWork, IRepositoryFactory cacheRepository)
{
this.mView = view;
this.unitOfWork = unitOfWork;
this.cacheRepository = cacheRepository;
this.Initialize();
}
В то время я чувствовал себя немного неловко из-за того, что не хочу держать открытым соединение с базой данных, но я не мог найти другого пути с использованием внедрения зависимостей Unity. Конечно же, когда я на самом деле пытаюсь использовать текст данных, я получаю эту ошибку:
((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}
Мое понимание принципа IoC заключается в том, что вы устанавливаете все свои зависимости наверху, разрешаете свой объект и все, и вы уходите. Тем не менее, в этом случае некоторые дочерние объекты, например, datacontext, не нужно инициализировать во время создания родительского объекта Presenter (как это было бы, передавая их в конструкторе), но Presenter действительно необходимо знать, какой тип использовать для IUnitOfWork, когда он хочет общаться с базой данных.
В идеале, я хочу что-то подобное в моем разрешенном докладчике:
using(IUnitOfWork unitOfWork = new NewInstanceInjectedUnitOfWorkType())
{
//do unitOfWork stuff
}
Таким образом, докладчик знает, какую реализацию IUnitOfWork следует использовать для непосредственного создания и удаления, предпочтительно из исходного вызова RegisterType. Нужно ли помещать другой контейнер Unity внутри моего Presenter, рискуя создать новую зависимость?
Это, вероятно, действительно очевидно для гуру IoC, но я бы очень оценил указатель в правильном направлении.