Реализация внедрения зависимостей в конструктор
Я использую WPF с Entity Framework 6 (DB first), Caliburn.Микро и Меф.
Я пытаюсь внедрить МОК в свой проект. Я абсолютный новичок в IoC, и, к сожалению, я не могу найти слишком много примеров, когда MEF используется с шаблоном репозитория.
Итак, у меня есть несколько репозиториев, и я создал свою общую единицу работы следующим образом:
class GenericUoW : IUoW, IDisposable { protected readonly DbContext _ctx; public GenericUoW(DbContext context) { _ctx = context; } public void Complete() { _ctx.SaveChanges(); } public void Dispose() { _ctx.Dispose(); } }
Мои фактические классы единиц работы реализованы следующим образом:
class InvoiceUoW : GenericUoW, IInvoiceUoW { public InvoiceUoW(DbContext _ctx) : base(_ctx) { salesrepo = new SaleRepository(_ctx); itemsrepo = new ItemRepository(_ctx); materialrepo = new MaterialRepository(_ctx); raterepo = new RateRepository(_ctx); clientrepo = new ClientRepository(_ctx); taxrepo = new TaxRepository(_ctx); stockhistoryrepo = new StockHistoryRepository(_ctx); proformarepo = new ProformaRepository(_ctx); } public ISaleRepository salesrepo { get; private set; } public IItemRepository itemsrepo { get; private set; } public IMaterialRepository materialrepo { get; private set; } public IRateRepository raterepo { get; private set; } public IClientRepository clientrepo { get; private set; } public ITaxRepository taxrepo { get; private set; } public IStockHistoryRepository stockhistoryrepo { get; private set; } public IProformaRepository proformarepo { get; private set; } }
Теперь, на мой взгляд, я делаю что-то вроде этого:
[Export(typeof(InvoiceViewModel))] class InvoiceViewModel : PropertyChangedBase { #region ctor [ImportingConstructor] public InvoiceViewModel(IInvoiceUoW invoiceUoW) { _uow = invoiceUoW; Clients = new BindableCollection<Client>(_uow.clientrepo.FetchAll()); } #endregion private readonly IInvoiceUoW _uow; //other properties and methods }
Мой вопрос связан с использованием IoC/DI в InvoiceUoW. Как реализовать инъекцию конструктора в этом классе? Потому что каждый из этих репозиториев в этом классе должен быть создан с одним и тем же DataContext. Пожалуйста, обратите внимание, что у меня есть несколько классов Unit of Work, каждый для одной viewmodel.
Что я уже пробовал:
Когда я пытаюсь сделать это с MEF, делая конструктор InvoiceUoW чем-то вроде этого
public InvoiceUoW(DbContext _ctx, ISaleRepository salerepo, IItemRepository itemsrepo,IMaterialRepository materialrepo, ... ) : base(_ctx)
он делает что-то эквивалентное этому:
salesrepo = new SaleRepository(new DbContext()); itemsrepo = new ItemRepository(new DbContext()); materialrepo = new MaterialRepository(new DbContext()); ...
Как я могу создать экземпляр всех репозиториев, используя один и тот же DbContext? Я думал об использовании фабрики, но это излишне усложнит код.
Tomas Takac
Зачем вам нужно вводить репозитории? В чем же выгода? Может быть, вы заходите слишком далеко. Просто мысль.
Sabyasachi Mukherjee
Итак, я должен просто ввести DbContext?
Tomas Takac
Я говорю, что ваш код так же хорош, как и сейчас, не усложняйте его без необходимости.