【问题标题】:Accessing Concrete Implementation of Interface, Dependency Injection访问接口的具体实现,依赖注入
【发布时间】: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


    【解决方案1】:

    在这种情况下,如果您不想使用存储库模式(我理解您不会),那么您还必须在接口中公开所有数据集:

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

    【讨论】:

    • 我不只是这样做,我想对数据库进行查询:var post = Context.MyTable.Where(item => item.PostId == model.PostId);
    • 在这种情况下,如果您不想使用存储库模式(我理解您不会),那么您还必须在界面中公开所有数据集。
    • 如何调用 DbContext.SaveChanges,就像我必须使用 System.Data.Entity.DbContext 接口(如果有的话)。我希望能够在覆盖后执行 base.SaveChanges()
    • 如果调用 Context.SaveChanges() 它会调用基类中的 SaveChanges,即 DbContext。
    • 是的,但如果 DbContext 是基础,那么我的接口 IHomeUpContext 现在有一个数据集,在这种情况下: IDbSet Posts { get;放; } 隐藏基类 DbContext 的 IDbSet Posts { get;放; } 而且我必须添加新的关键字,这似乎不对
    猜你喜欢
    • 2020-10-09
    • 2023-04-06
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多