Контейнеры для внедрения зависимостей — как мне получить конкретный экземпляр объекта?

#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