如何在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
接口。这个初始化逻辑应该在哪里处理?
在配置中将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();
// ...