【问题标题】:Interface inheritance and Unity resolve接口继承和Unity解析
【发布时间】:2018-09-28 11:37:15
【问题描述】:

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

【问题讨论】:

  • 如果你想对MyBar使用单例注册,你应该想办法告诉服务容器,为了解析IFoo,它可以解析IBar并投下,否则这两个接口中的每一个通常都会解析为 MyBar 类的两个不同实例。

标签: c# unity-container


【解决方案1】:

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

container.RegisterType<IBar, MyBar>();

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

但是容器不知道如果他被请求一个IFoo 的实例该怎么做,因为不是每个IFoo 都是IBar。那么写这个的时候应该返回什么:

container.GetInstance<IFoo>();

在您的情况下,只有一种类型是可能的,IBar 反过来也只有一种类型是可能的。然而,这与接口的目的相矛盾,因为实际上它总是绑定到一种特定类型,而它应该与实现该接口的 任何 类型一起使用。

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

【讨论】:

  • 这 100% 有意义。特别是你说的部分:“在你的情况下,只有一种类型是可能的,IBar 反过来也只有一种类型是可能的。然而,这与接口的目的相矛盾,因为事实上它总是有界的到一种特定类型,而它应该适用于实现该接口的任何类型。"。我的问题是:这是否也适用于 IBar(IBar 可以由其他类实现)?还是应该总是有一个单一类型类标识符接口?
猜你喜欢
  • 1970-01-01
  • 2012-06-10
  • 2023-03-19
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多