c# - 在 .NET 3.5 下的 Unity3D 中使用 Simple Injector 1 进行属性注入(inject)

标签 c# unity3d dependency-injection .net-3.5 simple-injector

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

Unity3D 将脚本程序集定位到 .NET 3.5,因此这意味着 System.ComponontModel.Composition 不可用,导致我无法使用所述的显式属性注入(inject)在简单注入(inject)器中 documentation .

所以我对 Simple Injector 的开发人员的问题是:“是否有任何其他方法可以将属性注入(inject)到由 Unity3D 引擎控制的类中?'.

最佳答案

在属性注入(inject)方面,有多种方法可以扩展简单注入(inject)器的默认行为,但最好的方法是覆盖简单注入(inject)器的 PropertyInjectionBehavior,如 here 所述。 .

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

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

更新

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

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

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

但是隐式属性注入(inject)有很多缺点,如所述here .这就是 InjectProperties 方法自 v2.6 以来被标记为 [Obsolete] 的原因。描述了其原因 here .由于此处所述的原因,Simple Injector v3 甚至不包含 InjectProperties 方法。

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

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

这使您可以在依赖注入(inject)方面应用最佳实践,而不必退回到丑陋的属性注入(inject),同时将不可测试的代码保持在绝对最低限度。

关于c# - 在 .NET 3.5 下的 Unity3D 中使用 Simple Injector 1 进行属性注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30439872/

相关文章:

c# - Web API 2 注入(inject) "error occurred when trying to create a controller"

spring - BeanInstantiationException - 构造函数抛出异常;嵌套异常是 java.lang.NullPointerException

c# - 在多行文本框中显示 ArrayList 条目

c# - 在 Unity3D 中声明类属性的最佳方式

.net - 使用 DI 传递同一接口(interface)的多个实现

c# - 如何打印列表中游戏对象的位置?

c# - 在特定位置删除 char,从字符串末尾开始计算

c# - 为什么 '{' 在静态方法中抛出 NullReferenceException?

c# - 以编程方式设置共享点列表项的字段值

c# - 将 AsymmetricAlgorithm 私钥和公钥与 RSA C# 结合使用