我正在使用C#,.NET Framework 4.0,Entity Framework Code First 6.0和Ninject开发ASP.NET MVC 4 Web Api。
我需要两个不同的DbContext
自定义实现,因为我需要连接两个不同的数据库。
这是我的自定义DbContext
类实现之一。
public class EFDbContext : DbContext, IUnitOfWork
{
public EFDbContext()
: base("name=EFDbContext")
{
// If database doesn't exit, don't create it.
Database.SetInitializer<EFDbContext>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new CONFIGURATIONSConfiguration());
modelBuilder.Configurations.Add(new CODESConfiguration());
modelBuilder.Configurations.Add(new AGGREGATION_CHILDSConfiguration());
modelBuilder.Configurations.Add(new AGGREGATIONSConfiguration());
base.OnModelCreating(modelBuilder);
}
}
两个DbContext
自定义类都将继承IUnitOfWork
我的问题,如果我不知道如何在NinjectConfigurator
类上区分它们:
private void AddBindings(IKernel container)
{
ConfigureLog4net(container);
container.Bind<IUnitOfWork>().To<EFDbContext>().InRequestScope();
// Hidden implementation...
}
如果我有两个不同的EFDbContext
课程,我如何在NinjectConfigurator
上区分它们?
也许我可以使用具有两个不同名称空间的相同IUnitOfWork
接口,并使用名称空间来区分它们。这里的问题是我将在两个不同的名称空间中重复相同的界面。
答案 0 :(得分:0)
你应该给它们命名。
Bind<IUnitOfWork>().To<EFDbContext>().Named("EF");
Bind<IUnitOfWork>().To<OtherDbContext>().Named("Other");
允许您这样做:
class MyRepository {
private IUnitOfWork _unitOfWork;
public([Named("EF")] IUnitOfWork unitOfWork)
_unitOfWork = unitOfWork;
}
}
答案 1 :(得分:0)
您还可以为两个上下文创建接口。
例如IEFDbContext1
和IEFDbContext2
。然后你的代码可以是:
Bind<IEFDbContext1>().To<EFDbContext1>().InRequestScope();
Bind<IEFDbContext2>().To<EFDbContext2>().InRequestScope();
提供更有意义的名字也是个好主意,因为目前EFDbContext并没有说明他的大部分职责。
我认为如果你需要模拟上下文,使用单独的接口也可以帮助你进行单元测试。