2011-01-30 4 views
3

ObservableCollection으로 (MyProject.ViewModels에있는) 모든 ViewModel에 DispatcherNotifiedObservableCollection을 삽입하고 싶습니다. Autofac이 기능을 제공하지 않지만, 몇 가지 해결 방법을 적용 할 수있는 Autofac vs Ninject contextual binding?Autofac을 사용하여 특정 네임 스페이스에 종속성 삽입하기

: 나는 니콜라스 Blumhardt에서 배운

Bind(typeof(ObservableCollection<>)) 
    .To(typeof(DispatcherNotifiedObservableCollection<>)) 
    .When(context => context.ParentContext.Binding 
     .Service.Namespace == "MyProject.ViewModels"); 

: 나는 이것을 달성 할 수 Ninject에 함께

.

감사합니다. (내 영어 죄송합니다)

편집 1 : 더 나은 설명을 변경 제목입니다.

편집 2, 3 : 더 나은 설명을 위해 내용과 제목이 변경되었습니다.

답변

8

답장 시간이 늦어서 죄송합니다. 당신은 IsClosedTypeOf()에 대한 using Autofac; 될해야합니다

// Default for other components 
builder.RegisterGeneric(typeof(ObservableCollection<>)); 

// Won't be picked up by default 
builder.RegisterGeneric(typeof(DispatcherNotifiedObservableCollection<>)) 
    .Named("dispatched", typeof(ObservableCollection<>)); 

var viewModelAssembly = typeof(AViewModel).Assembly; 
builder.RegisterAssemblyTypes(viewModelAssembly) 
    .Where(t => t.Name != null && t.Name.EndsWith("ViewModel")) 
    .WithParameter(
     (pi, c) => pi.ParameterType.IsClosedTypeOf(typeof(ObservableCollection<>)), 
     (pi, c) => c.ResolveNamed("dispatched", pi.ParameterType)); 

: Autofac와

가장 좋은 방법은 ViewModel의 등록에 대한 규칙을 사용하고 ObservableCollection<>의 다른 구현을 해결하기 위해 매개 변수를 적용하는 것입니다. 또한 사용중인 Autofac 버전이 WithParameter()의 과부하를 지원하지 않는 경우 Parameter을 대신 사용하여 ResolvedParameter을 전달하는 오버로드를 사용할 수 있습니다. 이 도움이

희망,

닉 코드에 대한

+0

감사합니다! 내 프로젝트에서 훌륭하게 작동합니다. –

관련 문제