所以我使用實體框架,我不會使用存儲庫模式,請不要認爲它。訪問接口的具體實現,依賴注入
我試圖創建一個從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投射到一個具體的實例中會破壞依賴注入的目的。
我不只是這樣做,我想對數據庫做一個查詢:var post = Context.MyTable.Where(item => item.PostId == model.PostId); –
在這種情況下,如果您不想使用存儲庫模式(我知道您不這樣做),那麼您還必須在界面中公開所有DataSet。 – dotnetom
如何調用DbContext.SaveChanges,就像我有使用System.Data.Entity.DbContext接口(如果有)。我希望能夠在覆蓋後執行base.SaveChanges() –