接口继承与Unity解析

Interface inheritance and Unity resolve

我正在尝试使用 Unity 通过它的 base 接口解析一个对象。如果我有以下接口和 classes:

interface IFoo { }
interface IBar : IFoo { }
class MyBar : IBar { }

我想像这样将 MyBar 注入多个 classes:

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 是否可以从其基本界面解析 class?

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

container.RegisterType<IBar, MyBar>();

container 知道,每当我被要求为 IBar 创建一些实例时,我都会通过实例化 MyBar.

来解决该调用

然而,容器不知道在请求 IFoo 实例时该怎么做,因为并非每个 IFoo 都是 IBar。那么写这个应该返回什么:

container.GetInstance<IFoo>();

在您的情况下,只有一种类型是可能的,IBar 反过来也只有一种类型是可能的。然而,这与接口的目的相矛盾,因为事实上它总是局限于一种特定类型,而它应该与实现该接口的 any 类型一起工作。

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