![](/img/trans.png)
[英]Property injection failing with both Ninject and Simple Injector
[英]Property injection with Simple Injector 1 in Unity3D under .NET 3.5
有多种方式多么简单喷油器的默认行为,可当它涉及到财产注射延长,但最好的方法是重写简单的喷油器的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.