【发布时间】:2014-09-22 09:33:50
【问题描述】:
InjectProperties 的简单注入器函数被标记为已弃用,并将在未来的版本中删除。我将如何在 Caliburn.Micro 的 BuildUp 覆盖中使用它?框架在内部通过IoC.BuildUp 多次使用它!
【问题讨论】:
标签: dependency-injection caliburn.micro simple-injector
InjectProperties 的简单注入器函数被标记为已弃用,并将在未来的版本中删除。我将如何在 Caliburn.Micro 的 BuildUp 覆盖中使用它?框架在内部通过IoC.BuildUp 多次使用它!
【问题讨论】:
标签: dependency-injection caliburn.micro simple-injector
InjectProperties 标有[Obsolete] 属性,编译器消息指向URL https://simpleinjector.org/depr1,它提供了更详细的信息。引用的页面解释了为什么不推荐使用此方法以及如何为此更改代码或配置。
该页面还链接到Property Injection paragraph of the Extendibility Points page。本页介绍如何配置容器以启用属性注入。例如:
class PropertySelectionBehavior<TAttribute> : IPropertySelectionBehavior
where TAttribute : Attribute
{
public bool SelectProperty(Type type, PropertyInfo prop) {
return prop.GetCustomAttributes(typeof(TAttribute)).Any();
}
}
// Usage:
var container = new Container();
container.Options.PropertySelectionBehavior =
new PropertySelectionBehavior<MyInjectAttribute>();
这允许容器注入使用[MyInject] 属性显式标记的属性。
如果可能,请始终尝试让容器为您创建类型,而不是使用具有默认构造函数的类型并在此之后注入属性。然而,我对 Caliburn Micro 不熟悉,我不确定这是否可能。
如果您需要类似 BuildUp 的行为,您可以从容器中检索注册并请求它为您初始化现有实例。如下所示:
public void BuildUp(object instance)
{
var registration = this.container.GetRegistration(instance.GetType(), true);
registration.Registration.InitializeInstance(instance);
}
这允许容器初始化实例并通过Simple Injector pipeline 发送它,该Simple Injector pipeline 可以根据给定的注册和配置规则(例如上面给出的显式属性注入示例)启用属性注入和其他初始化。
如果需要构建的类型具有默认构造函数,这将非常有用。如果不是这种情况,您将必须通过调用 Lifestyle.Transient.CreateRegistration 并在该实例上调用 InitializeInstance 来创建(并缓存)一个新的 Registration 实例,就像 MVC 集成包的 SimpleInjectorFilterAttributeFilterProvider 一样(你可以看看它的源代码here)。
【讨论】:
InitializeInstance(...) 使用您的建议