我正在尝试使用Unity通过其 base 接口解析对象。如果我具有以下接口和类:
interface IFoo { }
interface IBar : IFoo { }
class MyBar : IBar { }
我想将MyBar
注入多个类中,例如:
class DoSomething
{
public DoSomething(IFoo myBar)
{
// Execute a method from IFoo implementation
}
}
class DoSomethingElse
{
public DoSomethingElse(IBar myBar)
{
// Execute a method from IBar **AND** IFoo implementation
}
}
如果我这样注册MyBar
:
container.RegisterType<IBar, MyBar>();
Unity抛出一个错误,试图为IFoo
进行解析(请参阅DoSomething构造函数)。但是IBar
是从IFoo
继承的吗?
我可以这样向容器注册MyBar
两次:
container.RegisterType<IFoo, MyBar>();
container.RegisterType<IBar, MyBar>();
但是感觉我不必这样做。我可能在这里错了。
所以我的问题是Unity是否可以从其基本接口解析一个类?
答案 0 :(得分:2)
基本上,DI容器尝试通过某种映射来创建接口实例。所以当你写
container.RegisterType<IBar, MyBar>();
container
知道,每当要求我为IBar
创建某个实例时,我都会通过实例化MyBar
来解决该调用。
但是,如果请求一个IFoo
实例的容器,容器不知道该怎么办,因为并非每个IFoo
都是一个IBar
。因此,编写此代码时应返回什么:
container.GetInstance<IFoo>();
在您的情况下,只能使用一种类型,IBar
只能使用一种类型。但是,这与接口的用途相矛盾,因为实际上它始终受限于一种特定类型,而它应该与实现该接口的 any 类型一起使用。
这就是为什么您必须确定两个接口的映射。