使用单例实现依赖注入

时间:2017-03-28 09:10:16

标签: c# wpf dependency-injection inversion-of-control

我正在使用WPF与Entity Framework 6(数据库优先),Caliburn.MicroMEF

我正在尝试在我的项目中实现IoC。我是IoC的绝对初学者,不幸的是,我找不到MEFRepository Pattern一起使用的例子太多。

所以我有一些存储库,我已经创建了我的通用工作单元:

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; }
}

现在,在我的ViewModel中,我正在做这样的事情:

[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有关。如何在该课程中实施constructor injection?因为该类中的每个存储库都必须使用相同的DataContext进行实例化。如何使DataContext单身?请注意,我有几个Unit of Work个类,每个类只有一个viewmodel

1 个答案:

答案 0 :(得分:2)

注册要解析的DbContext实例并像单身人士一样行动:

var container = new CompositionContainer(); //Get it from where it belongs
var dbContext = container.GetExportedValue<DbContext>();
container.ComposeExportedValue<DbContext>(dbContext);

对于你的UoW,MEF的工作方式与Unity的工作方式不同,在MEF中你宁愿装饰实现类型告诉容器它应该注册它:

[Export(typeof(IUnitOfWork))]
public class MyUnitOfWork : IUnitOfWork
相关问题