接口继承和Unity解析

时间:2018-09-28 11:37:16

标签: c# unity-container

我正在尝试使用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是否可以从其基本接口解析一个类?

1 个答案:

答案 0 :(得分:2)

基本上,DI容器尝试通过某种映射来创建接口实例。所以当你写

container.RegisterType<IBar, MyBar>();

container知道,每当要求我为IBar创建某个实例时,我都会通过实例化MyBar来解决该调用。

但是,如果请求一个IFoo实例的容器,容器不知道该怎么办,因为并非每个IFoo都是一个IBar。因此,编写此代码时应返回什么:

container.GetInstance<IFoo>();

在您的情况下,只能使用一种类型,IBar只能使用一种类型。但是,这与接口的用途相矛盾,因为实际上它始终受限于一种特定类型,而它应该与实现该接口的 any 类型一起使用。

这就是为什么您必须确定两个接口的映射。