c# - Unity:告诉容器在注册类型时始终使用接口的特定实现
问题描述
我一直遇到这种情况:假设我有接口IFoo
和几个实现,比如RedFoo : IFoo
和BlackFoo : IFoo
. 然后我有接受IFoo
构造函数的类:
class BlackFooUser
{
public BlackFooUser(IFoo foo, other_parameters_here) {...}
}
class RedFooUser
{
public RedFooUser(IFoo foo, other_parameters_here) {...}
}
我如何告诉容器像往常一样解析所有其他参数,但总是BlackFoo
在构造时使用BlackFooUser
,并且总是RedFoo
在构造时使用RedFooUser
?我知道我可以ParameterOverride
在调用时使用Resolve()
,但我希望在Red/BlackFooUser
解决 a 时它是相同的,所以这应该进入RegisterType
or RegisterFactory
。
我可以做类似的事情
container.RegisterFactory<RedFooUser>(c=>new RedFooUser(c.Resolve<RedFoo>(), other_parameters_here));
但这非常冗长,每次添加新参数时都必须更改。
有没有更好的办法?
更新我特别希望通过容器注册来做到这一点,而不修改所涉及的类。造成这种情况的原因有很多,但归结为:
- 在类中编码依赖信息违反了关注点分离
- 在有许多类和许多依赖项的情况下,它的扩展性通常很差
- 它限制了类的组合方式
- 它将我限制在我拥有源代码并且可以随意修改的类
解决方案
当你注册你的类型时,你可以给它们一个名字,然后在这些类型被注入的构造函数中引用这个名字。像这样的东西:
public class BlackFoo : IFoo
{
public const string UNITY_KEY = "BlackFoo";
}
在您的容器注册中:
_container.RegisterType<IFoo, BlackFoo>(BlackFoo.UNITY_KEY, new ContainerControlledLifetimeManager());
在您的构造函数中:
public class BlackFooUser
{
public BlackFooUser([Dependency(BlackFoo.UNITY_KEY)] IFoo foo)
{
}
}
这确保了当容器进行依赖注入时,它将使用命名IFoo
注册。
推荐阅读
- spring - 如何在字段验证器中传递其他参数?
- css - 如何在 react.js 中创建动画颜色过渡?
- sql - 如何按位置而不是按列选择数量?
- regex - 正则表达式:匹配多个可能单词的最后一次出现,其中一个单词是另一个单词的尾随子集
- java - 在 ArrayList 中搜索单词
并将结果保存到地图 - mariadb - 如何在不重新启动服务的情况下重新加载 MaxScale 缓存规则?
- tfs - tfs签入项目要删除文件
- idris - 奇怪的编译器错误:无法将约束与约束1统一
- node.js - 在 MongoDB 中查找和更新孩子的孩子
- javascript - 即使我指定的是 en-gb,Bootstrap DateTimePicker 本地化也是 en-us