【问题标题】:DbContext in separate class library project with dependency injection具有依赖注入的单独类库项目中的 DbContext
【发布时间】:2019-03-21 00:54:18
【问题描述】:

我目前正在为一个学校项目创建一个 WebAPI。 之前与 DI 一起工作,但我似乎无法让它在当前环境中工作。

对于该项目,我正在为我的 DAL 需要通过 DI 获取 dbContext 的层使用多个项目。

数据库上下文:

public FICTIEContext(DbContextOptions<FICTIEContext> options)
        : base(options)
    {
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
        }
    }

启动寄存器:

      public void ConfigureServices(IServiceCollection services)
    {
       services.AddDbContext<FICTIEContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database")));
    }

调用 DAL 构造函数:

public class LoginBL
{
    private LoginDAL _LoginDAL;

    public bool LoginValidation(string login, string password)
    {
        _LoginDAL = new LoginDAL(); //Gives the error. As i remember given that dependency injection works correctly it should work like this.           
        return _LoginDAL.LoginValidation(login, password); ;
    }
}

对于我的 DAL,我正在使用带有类的 c# 类库项目,其中我有一个以 DbContext 作为参数的构造函数:

       private readonly FICTIEContext _Database;

    public LoginDAL(FICTIEContext database)
    {
        _Database = database;
    }

使用此代码时,我似乎无法调用构造函数而不会在调用 DAL 时不提供任何参数的错误。

我的解决方案缺少哪一部分以及如何解决。

【问题讨论】:

  • 你如何使用 LoginDAL - 你是在某处注入它(控制器)吗?
  • 不,我只有从另一个层引用它,我必须从中调用它
  • 能否提供调用 LoginDAL 构造函数的代码。
  • 如果注入 DAL,创建 DAL 实例的代码也需要新建 DbContext。但是你真的需要用 DbContext 注入 DAL 吗? DAL 的 EF 实现可以直接创建 DbContext 的实例。 DbContext 无论如何都属于 DAL。
  • @Innominatum 已将其添加到帖子中

标签: c# entity-framework dependency-injection


【解决方案1】:

当然,根据您当前的实现,在创建LoginDAL 的实例时,您需要提供FICTIEContext 的实例。这就是使用依赖注入的目的。

问题是在这种情况下您是否真的需要或想要依赖注入?我对此表示怀疑。无论如何,如果没有DbContext,就没有必要使用或测试 DAL 类。

在这种情况下,您可以简单地让 DAL 类在内部创建 FICTIEContext 的实例。如果您愿意,您当然也可以提供接受上下文的构造函数的重载:

private readonly FICTIEContext _Database;

public LoginDAL()
{
    _Database = new FICTIEContext();
}

public LoginDAL(FICTIEContext database)
{
    _Database = database;
}

然后该类的使用者可以选择是提供自定义FICTIEContext 还是让LoginDAL 类创建一个默认值。

【讨论】:

    猜你喜欢
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多