1

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

MachineData为 Spring.NET 定义了对象和使用它的所有对象,如下所示:

<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接口。这个初始化逻辑应该在哪里处理?

4

1 回答 1

1

在您的配置中将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();

// ...
于 2013-06-14T13:00:14.187 回答