Sabyasachi Mukherjee Ответов: 0

Реализация внедрения зависимостей в конструктор


Я использую 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

Я говорю, что ваш код так же хорош, как и сейчас, не усложняйте его без необходимости.

0 Ответов