【发布时间】: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