首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类库中的ASP.NET核心DI?

类库中的ASP.NET核心DI?
EN

Stack Overflow用户
提问于 2019-02-19 21:12:20
回答 2查看 6.6K关注 0票数 10

我有一个ASP.NET Core2.1项目,它引用了typ .NET核心类库的“数据访问层”项目。

数据访问Layger需要来自appsettings.json的ASP.NET核心项目的连接字符串。

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

代码语言:javascript
代码运行次数:0
运行
复制
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中有以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
services.AddScoped<IDatabaseConnectionString>(p => new DatabaseConnectionString(Configuration.GetConnectionString("DefaultConnection")));

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

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

例如,在这个类中填写IDatabasConnectionString:

代码语言:javascript
代码运行次数:0
运行
复制
public class UserFactory : FactoryBase
{
    private readonly IDatabaseConnectionString _iDatabaseConnectionString;

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

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-19 21:23:37

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

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

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

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

例如:

代码语言:javascript
代码运行次数:0
运行
复制
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成为只读的,那么它应该是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
public class DatabaseConnectionString : IDatabaseConnectionString
{
    public string ConnectionString { get; }

    public DatabaseConnectionString(string connectionString)
    {
        ConnectionString = connectionString;
    }
}
票数 7
EN

Stack Overflow用户

发布于 2019-02-19 21:23:26

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

  1. 在类库中定义一个类并将IDatabaseConnectionString注入其中。你的UserFactory是正确的方式。
  2. 为DI注册UserFactory serviceCollection.AddScoped();
  3. 通过DI解析UserFactory。例如,在某些控制器中使用UserFactory作为构造函数参数。一切都是由DI自动连接的。 公共MyController(IUserFactory userFactory) { _userFactory = myUserFactory;}

这里是理解组合根的很好的解释。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54774994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档