#c# #.net #dependency-injection #inversion-of-control #autofac
#c# #.net #внедрение зависимостей #Инверсия управления #autofac
Вопрос:
Например, у меня есть класс репозитория для получения данных из базы данных, и есть несколько классов служб, скажем, Service1, Service2, Service3.
У меня будет несколько экземпляров репозитория, например, для двух или трех баз данных. И вы должны иметь возможность настраивать службы для работы с определенной базой данных.
Я не могу понять, как реализовать эти зависимости с помощью контейнера для внедрения зависимостей.
Насколько я понимаю, я могу зарегистрировать службу репозитория либо как синглтон, либо для каждой зависимости будет создан новый экземпляр.
Но мне нужны только два репозитория, репозиторий («DB1») и репозиторий («DB2»), и при создании экземпляра службы я должен иметь возможность выбирать, с какой базой данных работать. То есть, как вариант -Service1(репозиторий («DB1»)), Service2 (репозиторий («DB1»)), Service1 (репозиторий («DB2»)).
Например:
public class Program
{
static void Main()
{
var connectionStringDb1 = "DB1 connection string";
var connectionStringDb2 = "DB2 connection string";
var repositoryDb1 = new Repository(connectionStringDb1);
var repositoryDb2 = new Repository(connectionStringDb2);
var smsSendService1 = new SmsSendService(repositoryDb1);
var smsSendService2 = new SmsSendService(repositoryDb2);
var emailSendService1 = new EmailSendService(repositoryDb1);
smsSendService1.Run();
var tasks = new Task[]
{
smsSendService1.Run(),
smsSendService2.Run(),
emailSendService1.Run()
};
Task.WaitAll(tasks);
}
}
public class Repository
{
private string _connectionString;
public Repository(string connectionString)
{
_connectionString = connectionString;
}
public object GetData()
{
// Getting data from the Database
var data = ...;
return data;
}
}
public class SmsSendService
{
private readonly Repository _repository;
public SmsSendService(Repository repository)
{
_repository = repository;
}
public Task Run()
{
return Task.Run(() =>
{
// Sending SMS in a loop
while (true)
{
var data = _repository.GetData();
// ...
Task.Delay(1000);
}
});
}
}
public class EmailSendService
{
private readonly Repository _repository;
public EmailSendService(Repository repository)
{
_repository = repository;
}
public Task Run()
{
return Task.Run(() =>
{
// Sending Email in a loop
while (true)
{
var data = _repository.GetData();
// ...
Task.Delay(1000);
}
});
}
}
Комментарии:
1. «контейнер для внедрения зависимостей». О каком контейнере DI вы говорите? Какая платформа? PHP, .NET, .NET Core, Java, что-то еще? Пожалуйста, отметьте свой вопрос соответствующим образом.
2. Кроме того, когда дело доходит до вопросов о настройке вашего контейнера DI, часто бывает полезно показать некоторый код, который демонстрирует, как будут выглядеть созданные вручную графики объектов. Например:
new A(new B(), new C(new D()))
является примером построенного вручную графа объектов (в синтаксисе C # / Java). Это дает читателям хорошее представление о конечном результате, к которому вы стремитесь.
Ответ №1:
Попробуйте взглянуть на экземпляры с именем autofac