使用unity注册实例注入依赖项

时间:2014-10-22 10:26:53

标签: c# dependency-injection unity-container

使用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();
}

如果没有使用这个过于冗长的工厂方法,如何使用已注册实例的方法为其他对象创建可注入的依赖项?

1 个答案:

答案 0 :(得分:4)

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

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