2013-06-13 2 views
1

중간 복잡도 WPF 응용 프로그램을 연결하기 위해 Spring.NET을 사용하고 있습니다. 객체 중 하나는 응용 프로그램이 실행되는 환경의 구성 설정을 나타냅니다. MachineData이라는 클래스는 기본적으로 호스트 컴퓨터에 저장된 값의 캐시입니다. 특정 MSSql 인스턴스가 설치되어 있는지 여부를 확인하고 거기에서 값을 가져 오면 다른 특정 프로그램이 설치되어 있는지 확인하고 app.config 중 일부를 가져옵니다. 설정 값 등이 있습니다.이 값은 응용 프로그램의 다른 많은 객체에서 필요하지만 응용 프로그램 시작시 한 번만 검색하면됩니다. Spring.NET으로 객체 설정을 처리하는 방법

나는 MachineData 개체 및 모든 객체가 Spring.NET에 대해 다음과 같이 정의 사용이 : MachineData.cs에서

<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> 

을, 내가 가진 :

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 : 두 번째는 IMachineData 인터페이스에 Init()를 노출 할 필요가있을

// 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() 호출에 실패 더 많은 포인트를 소개합니다. 이 초기화 로직을 어디에서 처리해야합니까?

답변

1

machineData 인스턴스를 구성에 singleton으로 구성하십시오. 이는 컨테이너 생성시 생성된다는 것을 의미합니다. MachineData 구성에서 으로 Init을 정의하거나 MachineDataIInitializingObject을 구현하도록하십시오. 후자의 경우 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(); 

// ...