繁体   English   中英

ASP.NET Core DI在类库中?

[英]ASP.NET Core DI in a class library?

我有一个ASP.NET Core 2.1项目,它引用了典型的.NET Core Class Library的“数据访问层”项目。

Data Access Layger需要来自ASP.NET Core项目中appsettings.json的连接字符串。

我创建了一个这样的简单容器:

public class DatabaseConnectionString : IDatabaseConnectionString
{
    private readonly string _connectionString;

    public DatabaseConnectionString(string connectionString)
    {
        _connectionString = connectionString;
    }

    public string ConnectionString {
        get { return _connectionString; }
        set {  }
    }
}

在ASP.NET Core Startup.cs> ConfigureService中我有这个:

services.AddScoped<IDatabaseConnectionString>(p => new DatabaseConnectionString(Configuration.GetConnectionString("DefaultConnection")));

我知道我可以将IDatabaseConnectionString添加到ASP.NET中的控制器的构造函数中以获取容器。 但是如何在课堂图书馆中获得它呢? 我不想从控制器一直向下传递它只是将IDatabaseConnectionString添加到类库中的类的构造函数不起作用。

我可能需要一个服务,我可以要求创建一个类的对象,让服务用正确的对象填充构造函数接口?

例如,填写此类中的IDatabasConnectionString:

public class UserFactory : FactoryBase
{
    private readonly IDatabaseConnectionString _iDatabaseConnectionString;

    public UserFactory(IDatabaseConnectionString connectionString)
    {
        _iDatabaseConnectionString = connectionString;
    }

}

类库中的控制器和类没有区别。 你需要

  1. 在类库中定义一个类并将IDatabaseConnectionString注入其中。 您的UserFactory是正确的方法。

  2. 注册DI的UserFactory

     serviceCollection.AddScoped<IUserFactory, UserFactory>(); 
  3. 通过DI解析UserFactory。 例如,在某些控制器中使用UserFactory作为构造函数参数。 一切都由DI自动连接。

     public MyController(IUserFactory userFactory) { _userFactory = myUserFactory; } 

是理解组合根的好解释。

我知道我可以将IDatabaseConnectionString添加到ASP.NET中的控制器的构造函数中以获取容器。

不,这不是必需的,这是错误的。

只是将IDatabaseConnectionString添加到类库中类的构造函数中不起作用。

它不起作用,因为您需要创建将使用连接字符串并将其添加到服务容器的服务。

例如:

public class Repository: IRepository
{
    public Repository(IDatabaseConnectionString databaseConnectionString)
    {
        _databaseConnectionString = databaseConnectionString;
    }
}

public class ServiceThatRequiresDatabase : IServiceThatRequiresDatabase
{
    public ServiceThatRequiresDatabase(IRepository repository)
    {
        _repository = repository;
    }
}

// ...
services.AddScoped<IRepository, Repository>();
services.AddScoped<IServiceThatRequiresDatabase, ServiceThatRequiresDatabase>();


public class HomeController : Controller
{
    public HomeController(IServiceThatRequiresDatabase service)
    {
        _service = service;
    }
}

顺便说一句,正如@YeldarKurmangaliyev所说,如果你想让它成为只读的,你的DatabaseConnectionString应该是这样的:

public class DatabaseConnectionString : IDatabaseConnectionString
{
    public string ConnectionString { get; }

    public DatabaseConnectionString(string connectionString)
    {
        ConnectionString = connectionString;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM