2012-10-04 25 views
3

每個我的倉庫類是這樣的:如何注入我的數據庫上下文到我所有的倉庫類

public class ProfileRepository : IProfileRepository{ 

    private MyEntities myEnt = new MyEntities(); 
    ... 

} 

我注入我的倉庫類,像這樣:

private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Bind<IProfileRepository>().To<ProfileRepository>(); 
      .... 
      GlobalHost.DependencyResolver = new NinjectDependencyResolver(kernel); 
      GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator),() => new MyConnectionFactory()); 
      RouteTable.Routes.MapHubs(new NinjectDependencyResolver(kernel)); 
     }  

我要注入MyEntities上下文到我所有的存儲庫類中,所以我沒有在每個存儲庫類中都有它的實例。我該如何做到這一點?這會是一個更好的做法嗎?

回答

3

首先,你會更好使用Ninject.MVC3包。它將爲您節省將Ninject附加到框架中的負擔,並且只會讓您擔心綁定。

然後可以使用 kernel.Bind<your-database-context>().ToSelf().InRequestScope()

這將確保所有的庫將得到同樣的DbContext,如果他們在同一個MVC請求創建。

注:若沒有Ninject.MVC3不能使用InRequestScope()。

這就是說,我認爲存儲庫是一個絕對可怕的抽象。您需要經過許多環節才能將您的數據訪問抽象出來,僅用於單元測試。你最好不要抽象出你的數據訪問(微軟已經在Entity Framework上做了一個很棒的工作),並且爲你的單元測試準備了一份體面的數據庫副本。 Django爲單元測試做了類似的事情,我想知道是否有一個單元測試系統能夠自動處理這個問題(包括應用比單元測試數據庫快照更新的遷移)。

+0

換句話說,我不應該注入我的上下文到我的倉庫嗎? – anthonypliu

+0

如果你有存儲庫,你*必須*注入你的上下文到它們中,並且你*必須*確保你每個請求只有一個上下文(實際上,這不是必須的,但它會讓你的生活變得更容易)。我說 - 根本沒有存儲庫,有更好的方法來完成單元測試。 – zmbq

+0

@anthonypliu:你應該。通過不注入上下文,您無法在不同場景中正確控制上下文的生命週期。 –

3

我已經通過創建一個通用的接口來實現這一點,即IMyEntitiesContext。現在

,我從記憶的時刻寫這,所以這可能是也可能不是100%正確的:

事情是這樣的:

public interface IMyEntitiesContext : IDisposable 
{ 
    IDbSet<Profile> Profiles { get; } 
    ... 
    ... 
    int SaveChanges(); 
} 

然後,改變你的DbContext類實現這個接口:

public MyEntities : DbContext, IMyEntitiesContext 
{ 
    public IDbSet<Profile> Profiles { get; set; } 
    ... 
    ... 
} 

現在,您可以通過使用IMyEntitiesContext建立構造/屬性注入:

public ProfileRepository : IProfileRepository 
{ 
    private IMyEntitiesContext _ctx; 

    public ProfileRepository(IMyEntitiesContext ctx) 
    { 
     _ctx = ctx; 
    } 
} 
相關問題