属性 在 .NET 3.5 下的 Unity3D 中使用 Simple Injector 1 注入

Property injection with Simple Injector 1 in Unity3D under .NET 3.5

我正在尝试将 Simple Injector v1.6Unity3D 结合使用 游戏引擎 (v5.0).
我需要使用 属性 Injection 因为 Unity3D 控制了程序集并且不允许 Constructor Injection,因为(它可能多么不幸be) 这就是 Unity3D API 目前 的方式。

Unity3D 将脚本程序集定位到 .NET 3.5,因此这意味着 System.ComponontModel.Composition 不可用,导致我无法使用显式 属性 注入如 Simple Injector documentation.

中所述

所以我向 Simple Injector 的开发人员提出的问题是:'是否有任何其他方法可以利用 属性 注入 类 由Unity3D引擎控制?'.

当涉及到 属性 注入时,有多种方法可以扩展 Simple Injector 的默认行为,但最好的方法是覆盖 Simple Injector 的 PropertyInjectionBehavior,如 here 所述。

你说构造函数注入不是一个选项。这表明无法拦截某些框架类型的创建。 Unity3d 框架在这里控制。

在这种情况下,您将不得不让 Simple Injector 构建现有类型。从来都不是最佳情况,但您可能对此无能为力。 This wiki page 描述了如何让 Simple Injector 建立外部实例。

更新

以上答案特定于 Simple Injector v2。 Simple Injector v2 获得了许多引人注目的新功能,例如用于启用 属性 注入的 IPropertySelectionBehavior 抽象,允许构建外部实例的 Registration class,以及 ExpressionBuilding 事件以允许拦截类型的创建以允许注入属性或字段。

然而,Simple Injector v2 需要 .NET 4.0,因此这意味着使用 v2 不适合您,因为您需要 .NET 3.5。所有这些功能在 Simple Inject v1 中都不可用,所以上面的答案对你来说没有意义。

剩下的唯一选择是使用 Container.InjectProperties(object) 方法允许对外部创建的实例进行隐式 属性 注入。

但是隐式 属性 注入有很多缺点,如 here. That's why the InjectProperties method has been marked [Obsolete] since v2.6. The reason for this is described here 所述。由于那里描述的原因,Simple Injector v3 甚至不会包含 InjectProperties 方法。

所以你唯一的选择是使用 InjectProperties 方法来构建你的对象,但请阅读参考文章以了解使用隐式 属性 注入的风险是什么。了解风险可以让您就这是否对您构成风险做出明智的决定,并允许您采取应对措施,例如编写额外的单元测试。

一个完全不同的选项,可能是使用 Humble Objects。这意味着,不是回退到 属性 注入,而是使用尽可能少的代码使需要由 Unity3D 创建的 class 尽可能小。您将所有有趣的逻辑及其所有依赖项移动到可以应用构造函数注入的自定义组件。在精简的 'humble' class 中,您只需解析新创建的组件并使用它。

这允许您在依赖注入方面应用最佳实践,而不必退回到难看的 属性 注入,同时将不可测试的代码保持在绝对最低限度。