使用.NET Core中的必需类重载AddTransient时,依赖项注入不起作用



在启动类中,我们添加了:

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 });
}

在TaskService中:

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,IEmailBodyServiceemailBodyService(

由于启动类中的瞬态过载而未启动。如何解雇建设者或任何其他解决方案?

您不应该使用Activator.CreateInstance,而应该使用ActivatorUtilities.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将调用适当的构造函数,服务ISendEmailServiceIEmailBodyService从服务提供者注入,而IMongoClient clientstring database是调用的参数。

最新更新