C# 访问接口的具体实现,依赖注入
所以我使用的是实体框架,我不会使用存储库模式,请不要建议 我正在尝试创建一个子上下文,它继承自System.Data.Entity.DbContext并使用依赖项注入,因此我需要一个接口和一个具体的实现 界面:C# 访问接口的具体实现,依赖注入,c#,asp.net-mvc,entity-framework,dependency-injection,ninject,C#,Asp.net Mvc,Entity Framework,Dependency Injection,Ninject,所以我使用的是实体框架,我不会使用存储库模式,请不要建议 我正在尝试创建一个子上下文,它继承自System.Data.Entity.DbContext并使用依赖项注入,因此我需要一个接口和一个具体的实现 界面: public interface IHomeUpContext { void Test(); } 我的实体框架生成的上下文: public partial class HomeUpEntities : 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.
}
然后是我的孩子控制器:
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.
}
要做到这一点,我必须在我的IHomeContext中定义一堆东西。因此,现在我必须将IHomeUpContext的注入式具体实现转换为控制器中的HomeUpContext。不,布埃诺
同样,我不会使用存储库模式和工作单元模式,我坚信它是10次中有9次泄漏的抽象,并且是一个不断螺旋上升的存储库API:
我想使用依赖注入,封装复杂的查询,但在控制器中直接执行简单的上下文保存更新和按id获取。但是必须将我的IHomeUpContext转换为一个具体实例会破坏依赖项注入的目的。在这种情况下,如果您不想使用我理解为您不想使用的存储库模式,那么您还必须公开接口中的所有数据集:
public interface IHomeUpContext
{
DbSet<channel> channel { get; set; }
int SaveChanges();
}
我不仅仅要这样做,我还想在数据库上进行查询:var post=Context.MyTable.Whereitem=>item.PostId==model.PostId;在这种情况下,如果您不想使用我理解为您不想使用的存储库模式,那么您也必须公开接口中的所有数据集。如何调用DbContext.SaveChanges,就像我必须使用System.Data.Entity.DbContext接口(如果有)一样。我希望能够在重写后执行base.SaveChanges如果调用Context.SaveChanges它调用基类中的SaveChanges,即DbContext.Ya,但是如果DbContext是基类,那么我的接口IHomeUpContext现在有一个数据集,在这种情况下:IDbSet Posts{get;set;}隐藏基类,DbContext的IDbSet Posts{get;set;}我必须加上新的关键词,这似乎不对