且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

类库中的ASP.NET Core DI?

更新时间:2023-02-16 07:37:07

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

I know that I can add the IDatabaseConnectionString to a constructor of a controller in ASP.NET to get the container.

否,这不是必需的,这是错误的.

No, that's not needed and it would be wrong.

仅将IDatabaseConnectionString添加到类库中的类的构造函数中是行不通的.

just adding the IDatabaseConnectionString to the constructor of a class in the class library do not work.

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

It doesn't work because you need to create the service that will use the connection string and add it to the services container.

例如:

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应该是这样的:


By the way, as @YeldarKurmangaliyev said, your DatabaseConnectionString should be like this if you want to make it read-only:

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

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