在启动类中,我们添加了:
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
将调用适当的构造函数,服务ISendEmailService
和IEmailBodyService
从服务提供者注入,而IMongoClient client
和string database
是调用的参数。