2013-06-13 3 views
1

Я использую Spring.NET для подключения приложения WPF средней сложности. Один из объектов представляет собой параметры конфигурации среды, в которой работает приложение. Класс, названный MachineData, представляет собой в основном кеш для значений, хранящихся на хост-машине: он проверяет, установлен ли конкретный экземпляр MSSql и получает какие-то значения от него, он проверяет, установлена ​​ли другая конкретная программа и получает ли она часть app.config настройки оттуда и т. д. Эти значения требуются многими другими объектами в приложении, но их нужно только один раз извлекать при запуске приложения.Как обрабатывать конфигурацию объекта с помощью Spring.NET

У меня есть 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"); 

Что работает отлично, но было бы ferable сделать следующее:

// 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. Где должна выполняться эта логика инициализации?

ответ

1

Настройте пример machineData как singleton в вашей конфигурации; это означает, что он будет создан при создании контейнера. В конфигурации MachineData определите Init как initialization method, или пусть 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(); 

// ... 
Смежные вопросы