Я изучаю образцы репозитория и единицы работы в приложении ASP.NET MVC 5 с Entity Framework 6.
Я уже прочитал много учебников и статей, но почти все из них являются кондективными. Говорят, что шаблоны репозитория и единицы работы хороши, другие говорят, что DbContext уже является хранилищем и единицей работы, другие говорят что-то похожее, но предлагают совершенно другой подход. Я пробовал все эти разные подходы (ну, может быть, не все) и все еще борется за то, какой подход является наиболее правильным.
В настоящее время у меня есть:
- IRepository и GenericRepository, реализующие IRepository
- IUnitOfWork и UnitOfWork для реализации IUnitOfWork
- IDbContext и MyDbContext, унаследованные от IdentityDbContext и реализующие IDbContext
Не уверен, что мне нужно вставить код для него, я думаю, что он довольно общий, и проблема на самом деле не связана с репозиторием /UnitOfWork как таковым. Проблема, с которой я сталкиваюсь, заключается в использовании классов Identity ASP.NET в сочетании с моими репозиториями и подразделением работы. Я использую одну и ту же базу данных для членства и для всех других данных - и я считаю это общим сценарием. Я не могу найти хорошее решение, как я могу создать экземпляры классов ASP.NET Identity с помощью своих репозиториев.
UserStore<ApplicationUser> store = new UserStore<ApplicationUser>(_DBCONTEXT_);
this.UserManager = new UserManager<ApplicationUser>(store);
Что я должен поставить вместо DBCONTEXT, чтобы он делил один и тот же DbContext с моим UnitOfWork? Или как это можно сделать каким-то другим способом, чтобы заставить ASP.NET Identity работать с UnitOfWork?
Я попытался разоблачить DbContext как общедоступное свойство класса UnitOfWork, например:
UserStore<ApplicationUser> store = new UserStore<ApplicationUser>(this.unitOfWork.MyDbContext);
Однако я не думаю, что это правильно - он не работает с пользовательским интерфейсом IDbContext и делает код не очень хорошим для модульного тестирования.
Я также пытался реализовать CustomUserStore и CustomRoleStore - в целом он работал, но, как я его тестировал, он требовал внедрить все больше и больше методов. Это решение выглядит слишком сложно - я действительно надеюсь, что там будет более простой способ.