在 .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 将调用适当的构造函数,服务 ISendEmailServiceIEmailBodyService 从服务提供者注入,而 IMongoClient clientstring database 是参数电话。