在.net 3.5下的Unity3D中使用简单注入器1进行属性注入
本文关键字:注入器 简单 注入 属性 net 5下 Unity3D | 更新日期: 2023-09-27 17:50:37
我正在尝试使用Simple Injectorv1.6结合Unity3D游戏引擎(v5.0)。
我需要使用属性注入,因为Unity3D有控制程序集,不允许构造器注入,因为(多么不幸的可能)这只是Unity3D的API 是目前的方式。
Unity3D将脚本程序集定向到。. NET 3.5,所以这意味着System.ComponontModel.Composition
不可用,导致我不能像简单注入器文档中描述的那样使用显式属性注入。
所以我对简单注入器的开发人员的问题是:'是否有其他方法利用属性注入到由Unity3D引擎控制的类中?'.
当涉及到属性注入时,有多种方法可以扩展Simple Injector的默认行为,但最好的方法是重写Simple Injector的PropertyInjectionBehavior,如下所述。
你说构造函数注入不是一个选项。这表明不可能拦截某些框架类型的创建。Unity3d框架在这里控制。
在这种情况下,你必须让简单注入器构建现有的类型。从来都不是最理想的情况,但你可能对此无能为力。这个wiki页面描述了如何让Simple Injector构建外部实例。
上面的答案是简单注入器v2特有的。Simple Injector v2获得了许多引人注目的新特性,如IPropertySelectionBehavior
抽象(支持属性注入)、Registration
类(允许构建外部实例)和ExpressionBuilding
事件(允许拦截类型创建以允许注入属性或字段)。
唯一的选择是使用Container.InjectProperties(object)
方法允许在外部创建的实例上隐式的属性注入。
InjectProperties
方法被标记为[Obsolete]的原因。原因如下所述。由于上面描述的原因,简单注入器v3甚至不包括InjectProperties
方法。
因此,您唯一的选择是使用InjectProperties
方法来构建对象,但是请阅读参考文章以了解使用隐式属性注入的风险是什么。了解风险可以让您做出明智的决定,确定这对您来说是否存在风险,并允许您应用应对措施,例如编写额外的单元测试。
一个完全不同的选择,可能是使用谦卑对象。这意味着,而不是回到属性注入,你使这个需要由Unity3D创建的类尽可能小,代码尽可能少。您可以将所有有趣的逻辑及其依赖项移动到可以应用构造函数注入的自定义组件中。在经过简化的'humble'类中,你只需要解析新创建的组件并使用它。
当涉及到依赖注入时,这允许你应用最佳实践,而不必回到丑陋的属性注入,同时将不可测试的代码保持在绝对的最低限度。