【问题标题】:How does unity resolve the parameters of a constructor?unity如何解析构造函数的参数?
【发布时间】:2015-06-03 12:38:36
【问题描述】:

我遇到了一些看起来像这样的代码:

var something = this.container.Resolve<ICatManager>();

在网络配置中有一个从ICatManagerCatManager 的映射。

但是,CatManager 有一个带有 2 个参数的构造函数,并且没有默认构造函数。

unity 如何创建它的实例?

【问题讨论】:

  • 该类型的配置中是否有构造函数部分?否则它可以只使用default 值吗?
  • 配置中没有其他内容。试图找到一些关于统一如何处理它的文档,但我的搜索返回了“我如何指定参数”的结果页面
  • msdn.microsoft.com/en-us/library/… - 也许这提供了一个答案? (自动构造函数注入)
  • 也许构造函数参数的类型也被统一注册/映射?在那种情况下,统一只是递归地解决它们。如果参数类型本身有 parameterless 构造函数,即使没有映射,unity 也可以为它们中的每一个创建一个实例。
  • @Abbondanza 是的,情况就是这样,它在我提供的链接中说明了这一点。

标签: c# unity-container


【解决方案1】:

Unity 和几乎所有其他服务容器/服务解析器/服务定位器通过分析可用的构造函数、找到“最好的”、然后注入参数来工作。

那么,这些参数从何而来?从服务容器本身。

例如,如果您有此服务:

interface IService { ... }
class ServiceImplementation : IService
{
    public ServiceImplementation(IOtherService os, IThirdService ts) { ... }
}

那么当您解析IService 时,Unity 将尝试同时解析IOtherServiceIThirdService 递归。如果实现这些服务的实际类还需要其他服务,它会递归地执行此解决方案,直到一切正常。

所以基本上你可以这样想解析调用:

var os = container.Resolve<IOtherService>();
var ts = container.Resolve<IThirdService>();
return new ServiceImplementation(os, ts);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多