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

C# 使用unity注册实例注入依赖项,c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,当使用Redis时,我们创建一个连接多路复用器,并从该获取数据库(),以访问给定的缓存 我希望将Unity配置为执行以下操作: ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); container.RegisterInstance(redis); container.RegisterType<IDatabase, redis.GetDatabase()>(); 除了使用这种过于冗长的工

当使用Redis时,我们创建一个
连接多路复用器
,并从该
获取数据库()
,以访问给定的缓存

我希望将Unity配置为执行以下操作:

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

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

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

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

太好了,我知道必须要有速记。不用担心。如果您想从注册的
ConnectionMultiplexer
获取数据库,那么您可以从container参数(
c
在上面的代码中)解析它,您的意思是:container.RegisterType(newinjectionfactory(c=>c.resolve().GetDatabase());这不是一回事吗?或者这和你的答案有不同的范围吗?是的,这就是我的意思。实际上,
ConnectionMultiplexer
IDatabase
都是线程安全的,可以传递,因此可以注册到singleton lifestyle,这意味着上面的结果与我的答案相同。但值得一提的是,如果你有没有单身生活方式的服务
public MyController(IRedisDatabaseFactory rdbf){
  _db = rdbf.GetDatabase();
}
container.RegisterType<IDatabase>(new InjectionFactory(c => redis.GetDatabase()));