避免将具体的数据库上下文类注入控制器

法兰瓦

我将Entity Framework Core for MySql与数据库优先方法结合使用。

搭建好数据库后,它会生成上下文类:sakilaContext.cs(sakila是MySql中的内置数据库/方案,我可以在其中玩耍)。

我将数据库注入了Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        var connectionString = @"server=localhost;port=1123;user=root;password=xxx;database=sakila";
        services.AddDbContext<sakilaContext>(options => options.UseMySql(connectionString));
    }

在我的api控制器中,我这样做如下:

private sakilaContext dbCtx;

public SakilaController(sakilaContext dbContext)
{
    dbCtx = dbContext;
}

就是好奇而已,

  1. 在这种情况下,注入具体的实现是错误的吗?
  2. 如果是这样,我怎么能只注入一个接口而不是注入一个具体的实现?

谢谢

埃里克·飞利浦

在这种情况下,注入具体的实现是错误的吗?

要看情况如果您要编写一个具有不同关注点(业务逻辑,验证,授权)的多层应用程序,还是要编写一个5页的应用程序来为有限数量的用户显示杂项信息?

对于小型应用程序(大多数是只读应用程序),我确实做到了这一点,因为只有很小的更改,而且我不需要进行过度设计和架构解决方案

如果是这样,我怎么能只注入一个接口而不是注入一个具体的实现?

当然可以,但是在某个时候,一个类将需要一个dbcontext,可以由需要它的对象对其进行DI或创建。如果您确实将数据访问抽象为一个单独的类/接口,那么我不建议您使用DI(将上下文注入到具体的数据访问中),因为具体的类型将与EF紧密耦合。这意味着,如果您决定切换到Dapper,NHibernate或其他ORM,则无论如何都必须重写所有方法。

快速而肮脏的方法(对于小型/学习型体验,我永远不会推荐给数百万个用户系统使用)抽象出DbContext,就像这样简单:

public interface IUserDA
{
  IQueryable<User> Users { get; }
}

public class MyDbContext : IUserDA
{
  public DbSet<User> Users { get; set; }

  IQueryable<User> IUserDA.Users
  {
     get
     {
        return Users;  // references the DbSet
     }
  }

}

现在,您的MyDbContext实现了一个未与实体框架耦合的接口。

但是,如果我们注入一个具体的类,它是否违反了DI的目的?

取决于您的目的。您到底想通过使用DI实现什么?您实际上是要编写真实的单元测试吗?您是否诚实地看到自己为多个安装/租户更改了接口或拥有多个接口实例?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

控制器外部的Jersey + Spring上下文

来自分类Dev

在视图控制器之间保持子上下文

来自分类Dev

有使用数据库上下文类的正确方法吗?

来自分类Dev

静态数据库上下文混乱

来自分类Dev

我可以扩展API控制器来保存数据库上下文的变量吗?

来自分类Dev

通过依赖注入将数据上下文对象传递给控制器是一个好主意吗?

来自分类Dev

将上下文注入到类似于Jersey InjectableProvider的Spring MVC控制器中

来自分类Dev

使用上下文管理器连接到sqlite3数据库

来自分类Dev

在控制器上下文之外获取视图

来自分类Dev

如何将Owin上下文传递给正在注入Api控制器的Repo

来自分类Dev

如何从控制器外部访问Rails控制器视图上下文?

来自分类Dev

Glass上下文数据库null

来自分类Dev

Light在MVC中注入数据库上下文

来自分类Dev

RSpec:控制器=>操作=>结果=>上下文规范

来自分类Dev

Linq Sql数据库上下文丢失方法

来自分类Dev

构造函数中上下文类的依赖注入

来自分类Dev

在Entity Framework中使用DbSet而不是IDbSet模拟数据库上下文类

来自分类Dev

如何在控制器中获取数据库上下文

来自分类Dev

在ASP控制器内创建数据库上下文实例有意义吗?

来自分类Dev

如何在graphql-dotnet中注入数据库上下文

来自分类Dev

使用上下文管理器选择数据库或文件处理程序

来自分类Dev

将数据库上下文注入自定义属性.NET Core

来自分类Dev

在视图控制器之间保持子上下文

来自分类Dev

我可以扩展API控制器来保存数据库上下文的变量吗?

来自分类Dev

将Servlet上下文参数传递给Spring MVC控制器

来自分类Dev

从上下文获取动作/控制器名称

来自分类Dev

使用接口将数据库上下文注入到类中

来自分类Dev

使用 SQLite 数据库将适配器 onBindViewHolder itemView 上下文转换为类上下文

来自分类Dev

哪个是将存储库模式用于数据库上下文的最佳代码?

Related 相关文章

  1. 1

    控制器外部的Jersey + Spring上下文

  2. 2

    在视图控制器之间保持子上下文

  3. 3

    有使用数据库上下文类的正确方法吗?

  4. 4

    静态数据库上下文混乱

  5. 5

    我可以扩展API控制器来保存数据库上下文的变量吗?

  6. 6

    通过依赖注入将数据上下文对象传递给控制器是一个好主意吗?

  7. 7

    将上下文注入到类似于Jersey InjectableProvider的Spring MVC控制器中

  8. 8

    使用上下文管理器连接到sqlite3数据库

  9. 9

    在控制器上下文之外获取视图

  10. 10

    如何将Owin上下文传递给正在注入Api控制器的Repo

  11. 11

    如何从控制器外部访问Rails控制器视图上下文?

  12. 12

    Glass上下文数据库null

  13. 13

    Light在MVC中注入数据库上下文

  14. 14

    RSpec:控制器=>操作=>结果=>上下文规范

  15. 15

    Linq Sql数据库上下文丢失方法

  16. 16

    构造函数中上下文类的依赖注入

  17. 17

    在Entity Framework中使用DbSet而不是IDbSet模拟数据库上下文类

  18. 18

    如何在控制器中获取数据库上下文

  19. 19

    在ASP控制器内创建数据库上下文实例有意义吗?

  20. 20

    如何在graphql-dotnet中注入数据库上下文

  21. 21

    使用上下文管理器选择数据库或文件处理程序

  22. 22

    将数据库上下文注入自定义属性.NET Core

  23. 23

    在视图控制器之间保持子上下文

  24. 24

    我可以扩展API控制器来保存数据库上下文的变量吗?

  25. 25

    将Servlet上下文参数传递给Spring MVC控制器

  26. 26

    从上下文获取动作/控制器名称

  27. 27

    使用接口将数据库上下文注入到类中

  28. 28

    使用 SQLite 数据库将适配器 onBindViewHolder itemView 上下文转换为类上下文

  29. 29

    哪个是将存储库模式用于数据库上下文的最佳代码?

热门标签

归档