如何在Spring.NET中处理对象配置

本文关键字:处理 对象 配置 NET Spring | 更新日期: 2023-09-27 18:18:11

我使用Spring。. NET连接一个中等复杂度的WPF应用程序。其中一个对象表示应用程序运行环境的配置设置。这个名为MachineData的类基本上是存储在主机上的值的缓存:它检查是否安装了特定的MSSql实例并从中获取一些值,它检查是否安装了另一个特定的程序并从中获取一些app.config设置,等等。应用程序中的许多其他对象都需要这些值,但只需要在应用程序启动时检索一次。

我有MachineData对象和所有使用它的对象,为Spring定义如下。净:

<object id="MachineData" type="IMachineData, SomeProject" singleton="true"/>
<object id="SomeOtherObject">
  <constructor-arg name="data" ref="MachineData"/>
</object>
<!-- A bunch of other objects w/ dependencies -->
<object id="MainApp" type="MainApplication">
  <property name="OtherObject" ref="SomeOtherObject"/>
  <!-- and so on -->
</object>

MachineData.cs中,我有:

public MachineData()
{
    Init();
}
private void Init()
{
    // Query database for settings, check app settings of other applications
}

App.xaml.cs中:

var ctx = ContextRegistry.GetContext();
MainApplication mainApp = (MainApplication)ctx.GetObject("MainApp");

可以很好地工作,但是这样做是否更好:

// in MachineData.cs
public MachineData()
{
}
public void Init()
{
    // Query database for settings, check app settings of other applications
}

// in App.xaml.cs
var ctx = ContextRegistry.GetContext();
MainApplication mainApp = (MainApplication)ctx.GetObject("MainApp");
var data = (IMachineData)ctx.GetObject("MachineData");
data.Init();

两者都有相同的预期效果,但是第一个选项在ContextRegistry.GetContext()调用中引入了更多的故障点,而第二个选项需要将Init()暴露给IMachineData接口。这个初始化逻辑应该在哪里处理?

如何在Spring.NET中处理对象配置

在配置中将machineData实例配置为单例;这意味着它将在容器创建时创建。在MachineData配置中,定义Init作为初始化方法,或者让MachineData实现IInitializingObject。对于后者,你需要显式地依赖于Spring.net。

你的应用程序启动代码将变成

// in App.xaml.cs
var ctx = ContextRegistry.GetContext();
MainApplication mainApp = (MainApplication)ctx.GetObject("MainApp");
// not needed; called by the spring container:
// var data = (IMachineData)ctx.GetObject("MachineData");
// data.Init();
// ...