InjectProperties
的简单注入器功能已标记为已弃用,将在以后的版本中删除。我如何在Caliburn.Micro的BuildUp
覆盖中使用它?框架在内部通过IoC.BuildUp
多次使用它!
答案 0 :(得分:6)
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发送它,根据给定的注册和配置规则(例如上面给出的显式属性注入示例)启用属性注入和其他初始化。
如果需要构建的类型具有默认构造函数,则此方法很有用。如果不是这种情况,则必须通过调用Registration
创建(并缓存)新的Lifestyle.Transient.CreateRegistration
实例,并在该实例上调用InitializeInstance
,就像{{1}一样MVC集成包的确(你可以看一下它的源代码here)。