0

所以我使用實體框架,我不會使用存儲庫模式,請不要認爲它。訪問接口的具體實現,依賴注入

我試圖創建一個從System.Data.Entity.DbContext繼承的孩子背景和同樣使用依賴注入,所以我需要一個接口和一個具體實現。

接口:

public interface IHomeUpContext 
    { 
     void Test(); 
    } 

我的實體框架產生的背景:

public partial class HomeUpEntities : DbContext 
... 

我的上下文的基類:

public class HomeUpContext : HomeUpEntities, IHomeUpContext 
{ 
    public override int SaveChanges() 
    { 
     return base.SaveChanges(); 
    } 

    public void Test() 
    { 

    } 
} 

而且我有以下的MVC基地控制器:

public class BaseController: Controller 
{ 
    public IHomeUpContext Context { get; set; }   
} 

然後我的孩子控制器:

public class HomeController : BaseController 
    { 
     public HomeController(IHomeUpContext context) 
     { 
      Context = context; 
     } 

     public ActionResult Index() 
     { 
      //complex queries encapsulated 
      var query = new ListPostsQuery(Context); 

      var posts = query.Execute(0, 10); 

      var postsViewModel = Mapper.Map<List<Post>, List<PostViewModel>>(posts); 

      return View(postsViewModel); 
     } 

     [HttpPost] 
     public ActionResult Edit(PostViewModel model) 
     { 
      var post = Context. //Only Test() method available here because my interface only defines that Method. 

     } 

很顯然,我做的依賴注入。在我HomeController.Edit方法我希望能夠到:

var post = Context.MyTable.Where(item => item.PostId == model.PostId); 

我必須定義了一堆東西在我IHomeContext做到這一點。所以現在我將不得不在我的控制器中將IHomeUpContext的具體實現注入到HomeUpContext中。沒有bueno。

我又不會使用存儲庫模式和工作模式的一個單位,我堅信這是一個漏水的抽象9倍的10和「不斷盤旋庫API」:http://www.wekeroad.com/2014/03/04/repositories-and-unitofwork-are-not-a-good-idea/

我想使用依賴注入,封裝複雜的查詢,但做簡單的上下文保存更新和直接在我的控制器中通過ID獲取。但是必須將我的IHomeUpContext投射到一個具體的實例中會破壞依賴注入的目的。

回答

0

在這種情況下,如果你不希望使用存儲庫模式(這我理解你不這樣做),那麼你不得不暴露在界面中的所有數據集,以及:

public interface IHomeUpContext 
{ 
    DbSet<channel> channel { get; set; } 
    int SaveChanges(); 
} 
+0

我不只是這樣做,我想對數據庫做一個查詢:var post = Context.MyTable.Where(item => item.PostId == model.PostId); –

+0

在這種情況下,如果您不想使用存儲庫模式(我知道您不這樣做),那麼您還必須在界面中公開所有DataSet。 – dotnetom

+0

如何調用DbContext.SaveChanges,就像我有使用System.Data.Entity.DbContext接口(如果有)。我希望能夠在覆蓋後執行base.SaveChanges() –