不带存储库的DbContext的依赖注入

时间:2016-06-13 22:09:24

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

我正在尝试学习如何在MVC 5 Web应用程序中的自动搭建控制器上使用依赖注入。虽然我找到了关于" Dependency Injection"的教程。和#34; Unity",我看到的例子更多的是你好的世界变种,从来没有真正处理过控制器中的数据库上下文。

为了让您更好地了解我的意思,这里有我所拥有的代码片段和我想要做的事情。

当我使用Visual Studio自动搭建一个带有视图的控制器时,使用Entity Framework",这通常是创建的。

public class TideUploadsController : Controller
    {
        // This is the EF Database context placed by the auto-scaffolder
        private AzMeritContext db = new AzMeritContext();

        [HttpGet]
        public ActionResult Index()
        {            
            return View(db.TideUploads.ToList());
        }

        /* further CRUD ActionResults not shown */

    }
}

从我到目前为止所读到的,使用依赖注入,我应该使用一个调用接口而不是类的构造函数。我已阅读有关围绕Entity Framework包装存储库的各种评论。我想看看我是否可以在不使用存储库的情况下执行此操作。

我是否应该使用预先存在的接口来代替自动脚手架放置在代码中的DbContext?

    // This is the EF Database context placed by the auto-scaffolder
    private AzMeritContext db = new AzMeritContext();

    public TideUploadsController(/* what Interface goes here? */)
    {
        //db = ?
    }

或者这是一种我真的需要围绕实体框架dbContext包装存储库的情况吗?

我花了几周时间阅读书籍并搜索教程和视频,我还没有看到一个分步示例,其中显示的内容如下:

  • 步骤1:拿走刚刚自动搭建的控制器
  • 第2步:这样做......
  • 步骤n:现在你的控制器与你的数据库环境松散耦合,而不是紧密耦合。

1 个答案:

答案 0 :(得分:1)

嗯,对我来说,依赖注入的好处之一就是你基本上正在解耦你的依赖关系"对于可模拟对象或其他实现,IMHO存储库模式是常见的方法,我没有看到任何其他替代方法必须使用包装器并在容器中配置接口和实现。

我猜你熟悉这个概念:

public class UserRepository:IUserRepository
{
   public UserRepository(){
    // you usually instanciate your context here
    // private AzMeritContext db = new AzMeritContext();
   }
   User GetUserById(int Id){
   // do your query to get a single user
   }
}

implementation对我来说没问题。

那么你的控制器应该是这样的:

    public class TideUploadsController : Controller
        {

            public TideUploadsController(IUserRepository userRepository){
              // constructor injection
              // assign your user repository to a local variable outside of the constructor scope something like _userRepository
            }

            [HttpGet]
            public ActionResult Index()
            {            
                return View(_userRepository.GetUserById(1)); 
                // let's assume your variable's name is _userRepository
            }

            /* further CRUD ActionResults not shown */

        }
    }

请记住,您的界面应该实现您想要在控制器,服务等中使用和公开的方法。

我的两分钱,我希望有所帮助。