具有依赖项注入的单独类库项目中的dbContext

时间:2019-03-20 15:12:59

标签: c# entity-framework dependency-injection

我目前正在为学校项目创建WebAPI。 之前曾与DI合作,但我似乎无法在当前环境下正常工作。

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

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时不提供任何参数的错误。

我的解决方案缺少哪一部分,我该如何解决。

1 个答案:

答案 0 :(得分:2)

在给定当前实现的情况下,创建FICTIEContext的实例时,当然需要提供LoginDAL的实例。这就是使用依赖注入的目的。

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

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

private readonly FICTIEContext _Database;

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

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

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