C# 访问接口的具体实现,依赖注入

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 ... 我的上下文基类

所以我使用的是实体框架,我不会使用存储库模式,请不要建议

我正在尝试创建一个子上下文,它继承自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.

         }
然后是我的孩子控制器:

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;}我必须加上新的关键词,这似乎不对