[英]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;
}
}
类库中的控制器和类没有区别。 你需要
在类库中定义一个类并将IDatabaseConnectionString
注入其中。 您的UserFactory
是正确的方法。
注册DI的UserFactory
serviceCollection.AddScoped<IUserFactory, UserFactory>();
通过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.