2013-05-17 3 views
0

이상 MVVM 시나리오의 ViewModel에서 UI 변경 사항을 다시 UI 스레드로 알리는 ObservableCollection<T>을 확장하는 중입니다. 이를 위해 UI DispatcherIOC까지 해결하고 궁극적으로 해결 된 Dispatcher 인스턴스를 내 사용자 정의 가능 유형 내에서 사용하려고합니다.디자인 검토 - IDispatcher 또는 Dispatcher 인스턴스 해결

초안은 다음과 같습니다.

class SafeObservableCollection<T>: ObservableCollection<T> 
{ 
    public SafeObservableCollection(IDispatcher currentDispatcher)//maybe an instance of Dispatcher 
    { 
    //assign resolved dispatcher to a private member 
    } 
} 

가정 :(a) 하나 디스패처/UIThread 사용 WPF 애플리케이션. (나) 나는 어떤 편차의 떨어져 ObservableCollection에

질문의 최우선 기본 클래스 멤버에서 (BackgroundWorker에를 사용하여 APM/EPM)를 생각하고 있지 않다 : 당신이 디스패처 인스턴스를 해결하기 위해 더 나은 무엇을 제안 할 수있는 설명 된 코드를 따라 가면서? 가능한 디자인 결함을 찾아내는 데 도움을 줄 수 있습니까? 메모리 누수, 교착 상태 또는 간과 한 것 등. 이 방법을 사용하기로 결정한 경우 Dispatcher 인스턴스의 수명은 얼마일까요?

답변

0

.NET 4.5를 사용하는 경우 새 차량을 발명해서 기존 기능을 사용할 수 없습니다.

//Creates the lock object somewhere 
private static object _lock = new object(); 

... 

//Enable the cross acces to this collection elsewhere 
BindingOperations.EnableCollectionSynchronization(_persons, _lock); 

이제 모든 스레드에서 _persons에 액세스 할 수 있습니다.

또한 스레드로부터 안전하게 관찰 할 수있는 WPFExtensions가 있습니다. http://wpfextensions.codeplex.com/

+0

의견을 주셔서 감사합니다. 그러나 여기서 우리는 스레드 유사성 문제 및 동기화 문제에 대해 이야기하고 있습니다. 그것을 확장 할 수 있습니까? – Nair

+0

친화력 문제는 무엇을 의미합니까? 내가 제공 한 코드를 사용하면 이미 WPF 4.5에서 해결되었습니다. 의미 UI는 별도의 스레드에서 생성되고 관리되는 컬렉션에 대해 바인딩 할 수 있습니다. Dispatcher는 관련이 없습니다. –

+0

Microsoft에서 "해결 된 스레드 유사성 문제"에 대해 설명하거나 이야기하는 링크를 참조하십시오. 그 동안 WPFExtension Lib의 주어진 링크에서 스레드 안전 관찰 가능을 구현할 수있는 방법에 대한 아이디어를 얻었습니다. 답변을 수락하기 전에 원래 게시물을 '확장에 대한 참조 만'으로 편집 할 수 있습니까? 이는 원했던 것과 가깝기 때문입니다. 아마 이것은 다른 사람들이 더 혼란 스러움없이 그 점을 얻는 데 도움이 될 것입니다. – Nair

0

IDispatcher이 조롱 당할 수 있기 때문에 단위 테스트 가능으로 만들려는 것으로 가정합니다. 그렇지 않다면 Application.Current.Dispatcher을 사용하여 주 스레드로 다시 호출 할 수 있습니다.

Application.Current.Dispatcher을 감싸는 콘크리트로 해석되는 IDispatcher을 주입하면 메모리 누수, 교착 상태 등과 같은 문제가 없어야하며 쉽게 테스트/테스트가 가능합니다.

난 그냥 당신의 SafeObservableCollection 클래스의 IDispatcher에 대한 참조를 떠나 추천 할 것입니다, 당신은 mockability의 이점을 잃게됩니다 이후되지는 UI 스레드 Dispatcher 자체에 대한 직접 참조를받을 수 있습니다. IDispatcherDispatcher 함수가 필요합니다.

평생 Dispatcher 래퍼의 인스턴스 중 하나가 SafeObservableCollection 일 때 좋지만, 추가 편집증 환자라면 IoC에서 문제없이 싱글 톤으로 해결할 수 있습니다.

+0

@ 글 레트 마 귀하의 지원에 감사드립니다. 최소한이 단계에서 단위 모델을 테스트하는 것이 아니라 애플리케이션 모델 프레임 워크 컬렉션 (관찰 가능 컬렉션)을 작성하는 것입니다.이 모델은 컬렉션 모델을 UI로 자동으로 전파 할 수 있습니다 (UIThread로 다시 변경 사항을 마샬링합니다.). – Nair

+0

이 경우 WindowsBase.dll을 참조하지 않으려는 경우를 제외하고는 앞서 언급 한 것처럼 'Application.Current.Dispatcher' 만 사용할 수 있습니다. 이 경우 전체 래퍼 인터페이스를 수행하고 삽입하면 트릭이 수행됩니다. 비록 당신이 testability/no-WindowsBase-reference를 원하지 않거나 필요로하지 않는다고하더라도, 당신이 설명했듯이 그것을 구현하는 한, 당신의 셋업은 여전히 ​​괜찮습니다. – Gjeltema

+0

필자가 쓴 것이 의미가 없거나 더 명확히하기를 원한다면 더 자세한 질문을하십시오. – Gjeltema

관련 문제