所以我使用的是Entity Framework,我不会使用存储库模式,请不要建议。
我正在尝试创建一个继承自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&#34;:{{3 }}
我想使用依赖注入,封装复杂的查询,但是直接在我的控制器中执行简单的上下文保存更新和id。但是,必须将我的IHomeUpContext强制转换为具体实例会破坏依赖注入的目的。
答案 0 :(得分:0)
在这种情况下,如果您不想使用存储库模式(我理解您不这样做),那么您还必须在界面中公开所有DataSet:
public interface IHomeUpContext
{
DbSet<channel> channel { get; set; }
int SaveChanges();
}