繁体   English   中英

.NET 3.5下在Unity3D中使用简单注入器1进行属性注入

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

我正在尝试将Simple Injector v1.6Unity3D游戏引擎( v5.0 )结合使用。
我需要使用物业注入 ,因为Unity3D拥有组装控制,不会让构造器注入 ,因为(多么不幸可能),这只是方式Unity3D的API 目前。

Unity3D将脚本程序集定位到.NET 3.5 ,因此这意味着System.ComponontModel.Composition不可用,导致无法像Simple Injector 文档中所述使用显式属性注入。

因此,我向Simple Injector的开发人员提出的问题是:' 还有其他方法可以将属性注入由Unity3D引擎控制的类中吗? ”。

有多种方式多么简单喷油器的默认行为,可当它涉及到财产注射延长,但最好的方法是重写简单的喷油器的PropertyInjectionBehavior作为解释在这里

您说构造函数注入不是一种选择。 这表明不可能拦截某些框架类型的创建。 这里是Unity3d框架的控制。

在这种情况下,您将不得不让Simple Injector建立现有类型。 从来都不是最佳情况,但是您几乎无能为力。 该Wiki页面描述了如何让Simple Injector构建外部实例。

UPDATE

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

但是,Simple Injector v2需要.NET 4.0,因此这意味着不建议使用v2,因为您需要.NET 3.5。 所有这些功能在Simple Inject v1中均不可用,因此上面的答案对您而言没有意义。

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

然而有许多缺点隐财产注射,如所描述这里 这就是为什么从v2.6开始将InjectProperties方法标记为[过时]的原因。 这样做的原因是描述在这里 由于此处所述的原因,Simple Injector v3甚至将不包含InjectProperties方法。

因此,您唯一的选择是使用InjectProperties方法来构建对象,但是请阅读参考文章以了解使用隐式属性注入的风险。 了解风险可以使您对是否存在风险做出明智的决定,并可以采取反措施,例如编写额外的单元测试。

完全不同的选择可能是使用Humble Objects 这意味着,您不必依靠属性注入,而是将需要由Unity3D创建的此类制作得尽可能小,并使用尽可能少的代码。 您将所有有趣的逻辑及其所有依赖项移至可应用构造函数注入的自定义组件。 在精简的“不起眼”类中,您只需解析新创建的组件并使用它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM