2015-08-26 70 views
0

使用EF 6和Ninject 3.2.2構建一個應用程序在包裝我的頭部時,如何以智能的方式訪問DbContext時遇到了一些麻煩。Ninject和DbContext

據我所知在Ninject的新版本中只鼓勵構造函數注入。作爲EF 6,本身就是回購和工作單元,我沒有在EF之上進行任何抽象。 如果希望能夠使用多個小單元的作品,那麼將DbContext(uow)注入每個需要它的類都不起作用。 在非IoC的方式,我會做這樣的:

Using(var db = new DbContext){} 

此使用Ninject,因爲我再也不能在我使用塊做kernel.get如何實現...

+0

EF提供您訪問數據庫。您仍然需要告訴它如何在該級別提取和操作數據。基於這個原因,我認爲使用回購和UoWs並沒有什麼問題。事實上,這就是Julie Lerman在她的Pluralsight課程中所表現的。 – Sphaso

+0

這是哪個課程?我剛剛看到了「EF 6初學者」課程,並且確實使用了回購協議,但是她沒有使用IoC,所以她沒有解決我遇到的問題...... – iCediCe

+0

我非常高興地看過「企業中的實體框架」。關於IoC問題,一旦你有回購,你可以注入任何其他類。 – Sphaso

回答

1

我會考慮兩個方法:

  1. 創建整體的DbContext,其中一個接口來隱藏:

    public interface IPortalContext : IDisposable 
    { 
        DbSet<User> Users { get; } 
    
        DbContext Context { get; } 
    } 
    
    public class PortalContext : DbContext, IPortalContext 
    { 
        public PortalContext() 
         : base("PortalConnectionString") 
        { 
        } 
    
        public virtual DbSet<User> Users { get; set; } 
    } 
    

    然後你可以注入你的上下文給構造函數沒有問題。

  2. 創建許多可以在不同場景和類中使用的小環境。

我不認爲第一種方法是不好的,因爲它只是封裝你DbSetsDbContext使其更容易注入和測試。您不會在EF之上製作任何不必要的圖層,並且整個界面看起來非常透明。

無論如何,這種方法比使整個IRepository<T>東西來訪問另一個存儲庫更好...

+0

這是個好建議!謝謝 – iCediCe

1

我不知道你所說的「工程的多個小單元」的意思,但只是爲了曝光,這是我在最近的應用程序已經完成:

  1. 分域小包圍上下文(這更是一個概念上的步驟的)
  2. 每個界上下文具有:上下文中,儲存庫,存儲庫工廠
  3. 每個上下文實現一個IContext這給了基本方法和共同性質的BaseContext(IContext將是有用嘲笑)
  4. 每個存儲庫tak ES相對上下文作爲構造paramenter
  5. 這是一個存儲庫工廠的一個例子

    公共類CartRepositoryFactory:IRepositoryFactory { 公共IRepository生成(CartContext CTX) { 返回新CartRepository(CTX); } }

  6. 在應用服務層,我注入UOW和倉庫工廠,我需要

  7. 如果我想在一個服務與幾個不同的上下文中工作,我只是創建另一個服務,並結合我需要的服務,注射他們

你可能會問,但爲什麼?!?這太瘋狂了!!

那麼,因爲如果Repository管理DbContext,那麼我只能對每個類實例化一個操作。這使我可以打開一個DbContext並對存儲庫進行多次調用。 當然,現在您在應用程序服務級別也遇到同樣的問題,每個實例只能調用一個方法,但管理起來要容易得多。

最終這一切都歸結於你的口味:你寧願有一個瘦服務或薄存儲庫?