2011-01-30 2 views
3

Я хочу добавить DispatcherNotifiedObservableCollection в (и только в) все ViewModels (расположенные в MyProject.ViewModels) как ObservableCollection.Использовать Autofac для инъекций зависимостей в пространственном пространстве имен

С Ninject я могу сделать это с:

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

Я узнал от Николая Blumhardt: Autofac vs Ninject contextual binding?

что Autofac не обеспечивает эту функциональность, но некоторые обходной путь может быть применен.

Спасибо!

(извините за мой английский)

Edit 1: Изменено название для лучшего описания.

Редактировать 2, 3: Изменено содержимое и название для лучшего описания.

ответ

8

Извините за медленный ответ.

Лучше с Autofac является использование правила для регистрации ViewModel с и применить параметр для решения другой реализации ObservableCollection<>:

// 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)); 

Вы должны быть using Autofac; для IsClosedTypeOf(). Кроме того, если версия Autofac, которую вы используете, не поддерживает эту перегрузку WithParameter(), вы можете использовать перегрузку, которая принимает Parameter и передает вместо этого ResolvedParameter.

Надеется, что это помогает,

Ник

+0

Спасибо за код! Хорошо работает в моем проекте. –

Смежные вопросы