【问题标题】:Static property injection configuration best practice静态属性注入配置最佳实践
【发布时间】:2012-02-10 13:57:26
【问题描述】:

我在多个类中使用了辅助组件。这是典型的场景:

public class HelperComponent 
{
    public void HelperMethod() 
    {
        // do something
    }
}

public class MyClass 
{
    private static HelperComponent Helper{ get; set;}

    public void Method1() 
    {
        Helper.HelperMethod();
    }
}

用法:new MyClass().Method1();

我想知道 spring.net 对此配置的建议配置/解决方案是什么? 最初我使用这一行来获取帮助组件:

ContextRegistry.GetContext().GetObject("HelperComponentName")

然后我读到这不是可取的解决方案,我应该使用注入以避免对 spring 的依赖并具有透明的组件使用。

我的问题是:如何使用 spring 配置来实现这一点?

我可以在类中注入静态属性吗?或者我应该让 Helper 实例属性? 如果我将 Helper 转换为实例属性,是否需要在 spring 配置中定义 MyClass 并使用 CreateObject 实例化 MyClass?
如果是,这对我来说不是令人满意的解决方案,因为我想实例化 MyClass 如上所述。

任何帮助表示赞赏。

【问题讨论】:

  • 我对spring不太熟悉,但是你想做的是注入依赖(通过构造函数或属性),非静态的,然后通过IOC容器管理生命周期. Spring 必须有办法将 HelperComponent 的生命周期设置为 Singleton。
  • @dtryon 我已经这样做了(因为我正在使用 context.GetObject() 检索它)。但是,如果我将 Helper 设置为 non.static,如何实例化 MyClass?正如我所说,我不想使用 context.CreateObject。
  • 通常的做法是在 MyClass 中有一个构造函数,它接受一个 HelperComponent 作为参数,然后设置一个相同类型的本地字段。然后,您将在容器中注册这两个类。之后,您将从容器中解析 MyClass,Spring 将自动实例化 HelperComponent。这样,Spring 将管理依赖的生命周期。
  • 最佳实践 静态属性注入是不使用静态属性注入。重构 MyClass 以在其构造函数中获取 HelperComponent 的实例。
  • 是的,或者更好的是,您可以只要求容器组成一个更高阶的对象,该对象包含图中某处的 MyClass。

标签: c# inversion-of-control spring.net


【解决方案1】:

我对 spring 不太熟悉,但是在使用 IOC 容器时,您通常会注册应用程序的所有依赖项(及其生命周期),然后解析对象图顶部的“入口点”对象.

这允许您利用 IOC 容器的功能,例如构造函数和属性注入。

这样设置后,您可以通过 IOC 容器配置管理各个对象的生命周期。

在这种情况下,我会在 IOC 容器配置中将 HelperComponent 注册为单例后,将 HelperComponent 注入到 MyClass 的构造函数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2013-04-21
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多