我有一个ASP.NET Core2.1项目,它引用了typ .NET核心类库的“数据访问层”项目。
数据访问Layger需要来自appsettings.json的ASP.NET核心项目的连接字符串。
我创建了这样一个简单的容器:
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;
}
}
发布于 2019-02-19 13:23:37
我知道,我可以将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;
}
}
发布于 2019-02-19 13:23:26
控制器和类库中的类没有区别。你需要
IDatabaseConnectionString
注入其中。你的UserFactory
是正确的方式。UserFactory
serviceCollection.AddScoped();这里是理解组合根的很好的解释。
https://stackoverflow.com/questions/54774994
复制相似问题