依赖注入容器-如何获取对象的特定实例?

问题描述

例如,我有一个Repository类,用于从数据库中获取数据,并且有几个服务类,例如Service1,Service2,Service3。

例如,对于两个或三个数据库,我将有多个存储库实例。并且,您应该能够配置服务以使用特定的数据库。

我不知道如何使用“依赖注入”容器来实现这些依赖。

据我了解,我可以将存储库服务注册为Singleton,否则将为每个依赖项创建一个新实例。

但是,我只需要两个存储库,即存储库(“ 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);
            }
        });
    }
}

解决方法

尝试看看autofac命名实例

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...