我正在使用WPF与Entity Framework 6
(数据库优先),Caliburn.Micro
和MEF
。
我正在尝试在我的项目中实现IoC
。我是IoC
的绝对初学者,不幸的是,我找不到MEF
与Repository 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
。
答案 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