我正在尝试将 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/