2014-07-25 44 views
0

我正在開發一個ASP.NET MVC 4 Web Api,使用C#,.NET Framework 4.0,Entity Framework Code First 6.0和Ninject。使用命名空間來區分兩個IUnitOfWork實現

我將需要兩個不同的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

他們應該真的以類名來區分。重命名上下文以引用要連接的數據庫,這聽起來更合理。所以現在你的上下文叫做'OrdersDatabaseContext',另外一個叫'CustomersContext'。 – DavidG

回答

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

感謝您的回答。我有另一個問題,http://stackoverflow.com/questions/24954374/ninject-named-binding-with-igenericrepository,與此相關。我使用通用庫,我不知道如何使用你的答案。 – VansFannel

+0

冒着回答它的自由;) –

0

您也可以創建兩個上下文接口。例如IEFDbContext1IEFDbContext2。那麼你的代碼可以是:

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

而且,這也是一個好主意,讓更多的有意義的名稱,因爲目前EFDbContext沒有告訴他的大部分責任。

我認爲如果你需要模擬上下文,使用單獨的接口也可以幫助你進行單元測試。