【发布时间】:2014-06-14 07:17:32
【问题描述】:
所以我使用的是实体框架,我不会使用存储库模式,请不要建议。
我正在尝试创建一个继承自 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。
再一次,我不会使用存储库模式和工作单元模式,我坚信它是 10 次中有 9 次的泄漏抽象和“不断螺旋的存储库 API”:http://www.wekeroad.com/2014/03/04/repositories-and-unitofwork-are-not-a-good-idea/
我想使用依赖注入,封装复杂的查询,但做简单的上下文保存更新并直接在我的控制器中获取 id。但是必须将我的 IHomeUpContext 强制转换为具体实例,这违背了依赖注入的目的。
【问题讨论】:
标签: c# asp.net-mvc entity-framework dependency-injection ninject