使用命名空间来区分两个IUnitOfWork实现

时间:2014-07-25 10:00:55

标签: c# entity-framework ninject

我正在使用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接口,并使用名称空间来区分它们。这里的问题是我将在两个不同的名称空间中重复相同的界面。

2 个答案:

答案 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)

您还可以为两个上下文创建接口。 例如IEFDbContext1IEFDbContext2。然后你的代码可以是:

Bind<IEFDbContext1>().To<EFDbContext1>().InRequestScope();
Bind<IEFDbContext2>().To<EFDbContext2>().InRequestScope();

提供更有意义的名字也是个好主意,因为目前EFDbContext并没有说明他的大部分职责。

我认为如果你需要模拟上下文,使用单独的接口也可以帮助你进行单元测试。

相关问题