使用统一注册的实例注入依赖项

本文关键字:实例 注入 依赖 注册 | 更新日期: 2023-09-27 18:27:22

使用Redis时,我们创建一个ConnectionMultiplexer,并从该GetDatabase()访问给定的缓存。

我想将Unity配置为如下所示:

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
container.RegisterInstance(redis);
container.RegisterType<IDatabase, redis.GetDatabase()>();

但毫不奇怪,它不会编译。

目前我唯一能想到的另一种方法是创建一个数据库工厂类,并将其传递到我的控制器中,而不是IDatabase,但这似乎有些过头了,因为我实际上只是在包装一个包装器:

 public static void RegisterComponents() {
    ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
    container.RegisterInstance(redis);
    RedisDatabaseFactory redisDbf = new RedisDatabaseFactory(redis);
    container.RegisterInstance(redisDbf);
    container.RegisterType<IRedisDatabaseFactory, RedisDatabaseFactory>();
}

MyController.cs

public MyController(IRedisDatabaseFactory rdbf){
  _db = rdbf.GetDatabase();
}

除了使用这种过于冗长的工厂方法之外,我如何使用注册实例的方法为其他对象创建可注入的依赖关系?

使用统一注册的实例注入依赖项

您可以使用InjectionFactory:为IDatabase注册工厂方法

container.RegisterType<IDatabase>(new InjectionFactory(c => redis.GetDatabase()));