C# 在表示层(MVC)中引用实体框架可以吗

C# 在表示层(MVC)中引用实体框架可以吗,c#,asp.net-mvc,dependency-injection,inversion-of-control,C#,Asp.net Mvc,Dependency Injection,Inversion Of Control,我有一个包含5个项目的C#解决方案 数据层(带EF的类库) 业务层(类库) 表示层(ASP.NET MVC) 公共图书馆 MSTest项目 我有我的参考设置这样 MVC引用业务层 业务层引用数据层 所有项目都引用公共库 我一直有这样一种困扰(OCD),即演示文稿不必引用EF和/或数据层项目,因为它不应该知道我的数据层在做什么,或者它是如何工作的。在我看来,它应该知道从服务层调用哪些函数并期望返回值。也许是对的,也许是错的 在我的服务层上,我有一个名为Services的类,它具有构造函数注入,如下

我有一个包含5个项目的C#解决方案

  • 数据层(带EF的类库)
  • 业务层(类库)
  • 表示层(ASP.NET MVC)
  • 公共图书馆
  • MSTest项目
  • 我有我的参考设置这样

  • MVC引用业务层
  • 业务层引用数据层
  • 所有项目都引用公共库
  • 我一直有这样一种困扰(OCD),即演示文稿不必引用EF和/或数据层项目,因为它不应该知道我的数据层在做什么,或者它是如何工作的。在我看来,它应该知道从服务层调用哪些函数并期望返回值。也许是对的,也许是错的

    在我的服务层上,我有一个名为Services的类,它具有构造函数注入,如下面的代码,因此可以使用模拟框架轻松地对其进行测试

    public class Services : IServices
    {
    
        public Services(IDbContext dbContext, IBuilders builders)
        {
            _dbContext = dbContext;
            _builders = builders;
        }
    }
    

    所以现在-如果我需要在我的MVC项目中使用它,我必须使用DI来处理这种情况,这样我就不必将我的控制器与DbContext类紧密耦合。但这要求我必须从表示层引用数据层,这是可以接受的做法吗?处理这种情况的好方法是什么?

    这应该可以回答您的问题:我从来没有想过创建类库并将控制器移到应用程序入口点后面的一层。真是个好主意。。。但这不是有点过分了吗?为什么我们必须跳转才能遵循这个概念?可能重复@PlatypusMaximus,您可以简单地接受这样一个事实,即您需要引用MVC项目中的数据访问项目。但至少现在你明白了,你这样做是因为ASP.NET模板迫使你这样做。我希望看到一个ASP.NET模板,它在一个单独的项目中具有组合根,在自己的项目中具有其他MVC内容。这应该可以回答您的问题:我从未想过创建类库并将我的控制器移动到应用程序入口点后的一层。真是个好主意。。。但这不是有点过分了吗?为什么我们必须跳转才能遵循这个概念?可能重复@PlatypusMaximus,您可以简单地接受这样一个事实,即您需要引用MVC项目中的数据访问项目。但至少现在你明白了,你这样做是因为ASP.NET模板迫使你这样做。我希望看到一个ASP.NET模板,该模板在一个单独的项目中具有组合根,在他们自己的项目中具有其他MVC内容。