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

时间:2014-06-14 07:17:33

标签: c# asp.net-mvc entity-framework dependency-injection ninject

所以我使用的是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强制转换为具体实例会破坏依赖注入的目的。

1 个答案:

答案 0 :(得分:0)

在这种情况下,如果您不想使用存储库模式(我理解您不这样做),那么您还必须在界面中公开所有DataSet:

public interface IHomeUpContext
{
    DbSet<channel> channel { get; set; }
    int SaveChanges();
}