2011-02-11 2 views
0

이제 막 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 컨테이너가 이것을 지원합니까? 방법? 어느 것?

죄송합니다. 기본 질문 인 경우 죄송합니다.

답변

1

MEF는 "계약 이름"을 사용하여 Export을 통해이를 지원합니다.
켄 스미스 IOC의 컨테이너가 밖으로 행동의이 종류를 지원하지 않는 것이 우리의 최종 결론은 아래 설명을 참조하십시오

[Import("bob", typeof(UserViewModel)] 
public UserViewModel bobViewModel { get; set; } 

을 편집 : 이것은 당신이 수출 및 계약 이름 가져 오기가 지정 할 수 있습니다 이 문제를 해결하기 위해 실제로 설계되지 않았습니다.

+0

런타임에서이 UserViewModel을 (디자인 타임이 아닌) "Bob"으로 지정하기 위해 *를 지정할 수 있습니까? MEF 내보내기/가져 오기 특성에 대한 문서에서 지금까지 읽은 것이 없지만 나는 그것을 믿을 수 밖에 없었습니다. 그러나 나는 잘못 될 수있었습니다. –

+0

"Bob"과 "Fred"의 차이점은 서로 다른 사용자라는 것입니다. 즉, 웹 서비스는 다양한 시점에서 UserId = "Bob"과 함께 UserId = "John"등과 같이 User 객체의 여러 인스턴스를 반환합니다. UserViewModel을 사용하여 이러한 User 객체를 래핑해야합니다. 하지만 (여러 번) 웹 서비스가 동일한 (실제) 사용자에 대해 다른 User 객체를 반환하더라도 각 사용자에 대해 하나의 UserViewModel 만 만들고 싶습니다. 말이 돼? –

+0

@Ken : Sort of - 개인적으로 새로운 VM을 사용자 주위에 배치하는 것은 이런 식으로 해결하려고하는 것보다 훨씬 쉽습니다.그렇지 않으면 VM을 만들고 테스트 결과를 직접 사전에 저장하는 팩토리를 가져옵니다. –

0

Spring.NET은 확실히 non-singleton 명명 된 객체를 지원합니다. Singleton이 기본 DI 동작이지만 개별 인스턴스가 만들어 지도록 지정할 수도 있습니다.

here 문서를 참조하십시오.

+0

"프로토 타입"범위에 대해 말하는 것 같습니까? 그렇다면 필자는 필자가 찾고있는 문서가 아니라고 생각한다. 나는 context.GetObject ("UserViewModel")'을 호출 할 때마다 새로운 인스턴스가 생성되는 것을 특별히 원하지 않는다. 내가 생각하는 구문은'context.GetObject (uvm => uvm.UserId = 'Bob')'과 비슷할 것이다. –

+0

아 - 내 실수 야. Spring.NET에 내장 된 기능을 알고 있지 않습니다. 자신 만의 데이터 구조 나 객체 스코프 (egads)를 코딩해야합니다. – Ben

관련 문제