C# 使用名称空间区分两个IUnitOfWork实现

C# 使用名称空间区分两个IUnitOfWork实现,c#,entity-framework,ninject,C#,Entity Framework,Ninject,我正在开发一个ASP.NET MVC4 Web Api,其中包括C#、.NET Framework 4.0、Entity Framework Code First 6.0和Ninject 我需要两个不同的DbContext自定义实现,因为我需要连接两个不同的数据库 这是我自定义的DbContext类实现之一 public class EFDbContext : DbContext, IUnitOfWork { public EFDbContext() : base("na

我正在开发一个ASP.NET MVC4 Web Api,其中包括C#、.NET Framework 4.0、Entity Framework Code First 6.0和Ninject

我需要两个不同的
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);
    }
}
如果我有两个不同的
EFDbContext
类,如何在
NinjectConfigurator
上区分它们

也许我可以使用相同的
IUnitOfWork
接口和两个不同的名称空间,并使用名称空间来区分它们。这里的问题是,我将在两个不同的名称空间中重复相同的接口。

您应该命名它们

Bind<IUnitOfWork>().To<EFDbContext>().Named("EF");
Bind<IUnitOfWork>().To<OtherDbContext>().Named("Other"); 

您还可以为这两种上下文创建接口。 例如
IEFDbContext1
IEFDbContext2
。那么您的代码可以是:

Bind<IEFDbContext1>().To<EFDbContext1>().InRequestScope();
Bind<IEFDbContext2>().To<EFDbContext2>().InRequestScope();
Bind().To().InRequestScope();
Bind().To().InRequestScope();
另外,给他起更多有意义的名字也是一个好主意,因为目前EFDbContext并没有告诉他很多责任


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

它们应该通过类名来区分。重命名上下文以引用所连接的数据库,这样听起来可能更符合逻辑。现在您有了名为
OrdersDatabaseContext
的上下文和另一个名为
CustomerContext
的上下文。谢谢您的回答。我还有一个问题,和这个有关。我使用的是通用存储库,我不知道如何使用您的答案。我还冒昧地回答了;)
class MyRepository {
    private IUnitOfWork _unitOfWork;

    public([Named("EF")] IUnitOfWork unitOfWork)
        _unitOfWork = unitOfWork;
    }
}
Bind<IEFDbContext1>().To<EFDbContext1>().InRequestScope();
Bind<IEFDbContext2>().To<EFDbContext2>().InRequestScope();