이제 막 IoC 컨테이너를 실험하기 시작했습니다. 현재, 집에서 자란 공장을 사용하여 ViewModels을 빌드하고 있는데, 여기에는 싱글 톤과 ID 기반의 두 가지가 있습니다. 즉, 내 응용 프로그램 (정의에 따라)은 한 번에 하나의 Room 만 가지므로 한 개의 RoomViewModel 만 있지만 많은 사용자가이 방에있을 수 있으므로 많은 UserViewModels가 필요합니다. 그러나 UserId = "johnsmith"인 User에 대해 하나의 UserViewModel 만 만들어 졌는지 확인하고 해당 UserViewModel을 검색하려고하면 동일한 인스턴스가 반환됩니다.식별자를 기반으로 특정 객체를 반환하는 IoC 컨테이너를 지원합니까?
그들을 물건을 설명하거나 혼동 도움이 될 것인지는 모르겠지만, 이것은 내가 현재이 어떻게 사용하고하는 방법입니다 :
public ViewModelType GetViewModelByKey<ViewModelType, KeyType>(KeyType key)
where ViewModelType : AlantaViewModelBase, new()
{
IDictionary dictionary;
var type = typeof(ViewModelType);
if (!keyedViewModelDictionaries.TryGetValue(type, out dictionary))
{
dictionary = new Dictionary<KeyType, ViewModelType>();
keyedViewModelDictionaries.Add(type, dictionary);
}
var viewModels = (Dictionary<KeyType, ViewModelType>)dictionary;
ViewModelType vm;
if (!viewModels.TryGetValue(key, out vm))
{
vm = new ViewModelType();
viewModels.Add(key, vm);
vm.Initialize(this);
}
return vm;
}
이이 두 호출은 별도의 반환된다는 것을 의미합니다 인스턴스 :
// Get VM for user.UserId="john";
var userVM1 = viewModelFactory.GetViewModelByKey<UserViewModel, string>("john");
// Get VM for user.UserId="suzie";
var userVM2 = viewModelFactory.GetViewModelByKey<UserViewModel, string>("suzie");
그러나 이러한 동일한 인스턴스를 반환합니다
// Get the same VM for user.UserId="bob";
var userVM1 = viewModelFactory.GetViewModelByKey<UserViewModel, string>("bob");
var userVM2 = viewModelFactory.GetViewModelByKey<UserViewModel, string>("bob");
구간 이렇게하는 능력은 많은 데이터 바인딩 및 동기화 문제를 해결하므로 쉽게 포기할 패턴이 아닙니다.
그러나 가능하면 표준 IoC 컨테이너로 이동하십시오. 아마도 더 많은 기능을 갖추고 특정 유형을 필요로하지 않으며 확실히 표준화되어 있기 때문입니다. 그러나 그들에 대해 읽어 보면 두 번째 접근법을지지한다는 명백한 징후를 발견하지 못했습니다. 다른 말로하면, 그들은 모두 표준 2 가지 라이프 스타일 (싱글 톤 및 과도)을 지원하지만, 나는 조금 다른 것을 원한다 : 객체 정체성 당 싱글 톤. 표준 IoC 컨테이너가 이것을 지원합니까? 방법? 어느 것?
죄송합니다. 기본 질문 인 경우 죄송합니다.
런타임에서이 UserViewModel을 (디자인 타임이 아닌) "Bob"으로 지정하기 위해 *를 지정할 수 있습니까? MEF 내보내기/가져 오기 특성에 대한 문서에서 지금까지 읽은 것이 없지만 나는 그것을 믿을 수 밖에 없었습니다. 그러나 나는 잘못 될 수있었습니다. –
"Bob"과 "Fred"의 차이점은 서로 다른 사용자라는 것입니다. 즉, 웹 서비스는 다양한 시점에서 UserId = "Bob"과 함께 UserId = "John"등과 같이 User 객체의 여러 인스턴스를 반환합니다. UserViewModel을 사용하여 이러한 User 객체를 래핑해야합니다. 하지만 (여러 번) 웹 서비스가 동일한 (실제) 사용자에 대해 다른 User 객체를 반환하더라도 각 사용자에 대해 하나의 UserViewModel 만 만들고 싶습니다. 말이 돼? –
@Ken : Sort of - 개인적으로 새로운 VM을 사용자 주위에 배치하는 것은 이런 식으로 해결하려고하는 것보다 훨씬 쉽습니다.그렇지 않으면 VM을 만들고 테스트 결과를 직접 사전에 저장하는 팩토리를 가져옵니다. –