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