【问题标题】:Caliburn.Micro and Simple Injector - InjectProperties is deprecated - How to BuildUp()?Caliburn.Micro 和 Simple Injector - InjectProperties 已弃用 - 如何 BuildUp()?
【发布时间】:2014-09-22 09:33:50
【问题描述】:

InjectProperties 的简单注入器函数被标记为已弃用,并将在未来的版本中删除。我将如何在 Caliburn.Micro 的 BuildUp 覆盖中使用它?框架在内部通过IoC.BuildUp 多次使用它!

【问题讨论】:

    标签: dependency-injection caliburn.micro simple-injector


    【解决方案1】:

    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)。

    【讨论】:

    • 感谢 Steven 的快速回复。我实际上阅读了该链接,但不知道如何运行通过容器管道在容器外部创建的实例。
    • 我有点担心,有些使用的类型没有在容器中注册——只有它们的属性。这都是在框架内,我不确定内部工作原理......
    • @MarkusHütter:我对 Caliburn 和 WPF 没有经验,不知道这里有什么建议。您能否更新您的问题,即给我一个指向一些在线资源的链接,该资源解释了需要“构建”哪些类型以及如何使用它们?
    • 嗯,我只是在查看 resharper 显示的用法。寻找我发现的文档:““BuildUp”可选地用于向框架执行的 IResult 实例提供属性依赖项。”查看代码,框架提供的继承 IResult 的类甚至没有可注入的属性。所以我想我可以注册自己的 IResult 类并通过InitializeInstance(...) 使用您的建议
    • 感谢您的帮助。我认为您甚至没有为您提供的所有这些彻底的答案获得足够的信任。所有这些问题看起来都非常具体,没有其他人,但您似乎回答了它们(关于 Simple Injector)!
    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多