在 .NET Core 中使用必需的 类 重载 AddTransient 时依赖注入不起作用
Dependency injection not working when overloading AddTransient with required classes in .NET Core
在启动时 class 我们添加了:
services.AddTransient<ITasksService, TasksService>(provider => MultiTenentDB<TeamService>(provider));
private T MultiTenentDB<T>(IServiceProvider provider)
{
IServiceScope scope = provider.CreateScope();
AppTenant appTenent = scope.ServiceProvider.GetService<AppTenant>();
if (appTenent == null)
throw new InvalidOperationException("Organization id required");
string connectionString = string.Format(appTenent.MongoDbServer.ConnectionString);
MongoClient mongoClient = new MongoClient(connectionString);
string database = "";
if (_env.IsProduction())
{
database = appTenent.MongoDbServer.DatabaseProd;
}
else
{
database = appTenent.MongoDbServer.Database;
}
return (T)Activator.CreateInstance(typeof(T), new object[] { mongoClient, database });
}
在任务服务中:
public class TasksService : ITaskService
{
public readonly ISendEmailService _SendemailService;
public readonly IEmailBodyService _emailBodyService;
private IMongoCollection<TasksModel> _task;
public TasksService(IMongoClient client, string database)
{
_database = client.GetDatabase(database);
_task = _database.GetCollection<TasksModel>("Tasks");
}
public TasksService( ISendEmailService SendemailService, IEmailBodyService emailBodyService)
{
_SendemailService = SendemailService;
_emailBodyService = emailBodyService;
}
}
TasksService( ISendEmailService SendemailService, IEmailBodyService
emailBodyService)
由于启动时的瞬态过载而未触发 class。如何触发构造函数或任何其他解决方案?
您应该使用 ActivatorUtilities.CreateInstance
,而不是使用 Activator.CreateInstance
,它允许您从提供者注入服务。
这样,您就可以拥有一个构造函数:
public TasksService( ISendEmailService SendemailService, IEmailBodyService emailBodyService, IMongoClient client, string database)
{
_SendemailService = SendemailService;
_emailBodyService = emailBodyService;
_database = client.GetDatabase(database);
_task = _database.GetCollection<TasksModel>("Tasks");
}
然后在 MultiTenentDB<T>
中:
return ActivatorUtilities.CreateInstance<T>(provider, mongoClient, database);
ActivatorUtilities.CreateInstance
将调用适当的构造函数,服务 ISendEmailService
和 IEmailBodyService
从服务提供者注入,而 IMongoClient client
和 string database
是参数电话。
在启动时 class 我们添加了:
services.AddTransient<ITasksService, TasksService>(provider => MultiTenentDB<TeamService>(provider));
private T MultiTenentDB<T>(IServiceProvider provider)
{
IServiceScope scope = provider.CreateScope();
AppTenant appTenent = scope.ServiceProvider.GetService<AppTenant>();
if (appTenent == null)
throw new InvalidOperationException("Organization id required");
string connectionString = string.Format(appTenent.MongoDbServer.ConnectionString);
MongoClient mongoClient = new MongoClient(connectionString);
string database = "";
if (_env.IsProduction())
{
database = appTenent.MongoDbServer.DatabaseProd;
}
else
{
database = appTenent.MongoDbServer.Database;
}
return (T)Activator.CreateInstance(typeof(T), new object[] { mongoClient, database });
}
在任务服务中:
public class TasksService : ITaskService
{
public readonly ISendEmailService _SendemailService;
public readonly IEmailBodyService _emailBodyService;
private IMongoCollection<TasksModel> _task;
public TasksService(IMongoClient client, string database)
{
_database = client.GetDatabase(database);
_task = _database.GetCollection<TasksModel>("Tasks");
}
public TasksService( ISendEmailService SendemailService, IEmailBodyService emailBodyService)
{
_SendemailService = SendemailService;
_emailBodyService = emailBodyService;
}
}
TasksService( ISendEmailService SendemailService, IEmailBodyService emailBodyService)
由于启动时的瞬态过载而未触发 class。如何触发构造函数或任何其他解决方案?
您应该使用 ActivatorUtilities.CreateInstance
,而不是使用 Activator.CreateInstance
,它允许您从提供者注入服务。
这样,您就可以拥有一个构造函数:
public TasksService( ISendEmailService SendemailService, IEmailBodyService emailBodyService, IMongoClient client, string database)
{
_SendemailService = SendemailService;
_emailBodyService = emailBodyService;
_database = client.GetDatabase(database);
_task = _database.GetCollection<TasksModel>("Tasks");
}
然后在 MultiTenentDB<T>
中:
return ActivatorUtilities.CreateInstance<T>(provider, mongoClient, database);
ActivatorUtilities.CreateInstance
将调用适当的构造函数,服务 ISendEmailService
和 IEmailBodyService
从服务提供者注入,而 IMongoClient client
和 string database
是参数电话。