2015-12-08 3 views
0

У меня есть следующий конструктор:объекта Разрешающего со списком различных реализаций в качестве параметра конструктора, используя замок Виндзор

public DataImporterService(IList<IDataValidator> dataValidators,  IList<IDataComparer> dataComparers, IList<IDataStorage> dataStorages) 
     { 
      _dataValidators = dataValidators; 
      _dataComparers = dataComparers; 
      _dataStorages = dataStorages; 
     } 

и это моя регистрация:

Component.For<IDataComparer>().ImplementedBy<PlanOfRecordComparer>().Named("planOfRecordComparer"), 
       Component.For<IDataComparer>().ImplementedBy<PlanOfExecutionComparer>().Named("planOfExecutionComparer"), 
       Component.For<IDataComparer>().ImplementedBy<BomComparer>().Named("bomComparer"), 
       Component.For<IDataStorage>().ImplementedBy<PlanOfRecordStorage>().Named("planOfRecordStorage"), 
       Component.For<IDataStorage>().ImplementedBy<PlanOfExecutionStorage>().Named("planOfExecutionStorage"), 
       Component.For<IDataValidator>().ImplementedBy<PlanOfExecutionValidator>().Named("planOfExecutionValidator"), 
       Component.For<IDataValidator>().ImplementedBy<PlanOfRecordValidator>().Named("planOfRecordValidator"), 
       Component.For<IDataValidator>().ImplementedBy<BomValidator>().Named("bomValidator") 

но можно зарегистрировать компоненты по-другому не нужно указывать каждую реализацию IDataComparer, IDataValidator и IDataStorage? Как в более общем виде?

ответ

0

Хорошо это, как я сделал это работает:

Прежде I использовал collectionresolver:

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 

Чтобы зарегистрировать все классы, которые реализуют IDataComparer, IDataStorage, IDataValidator

Classes.FromThisAssembly().Where(x => x.Name.EndsWith("Validator")).WithServiceFirstInterface(), 
Classes.FromThisAssembly().Where(x => x.Name.EndsWith("Comparer")).WithServiceFirstInterface(), 
Classes.FromThisAssembly().Where(x=>x.Name.EndsWith("Storage")).WithServiceFirstInterface() 

Тогда я был в состоянии решить мой класс:

public DataImporterService(IDataValidator[] dataValidators, IDataComparer[] dataComparers, IDataStorage[] dataStorages) 
     { } 

Так что, когда замок Виндзор пытается resovle в DataImporterService он захватывает все классы, которые реализуют инъекционные интерфейсы, построить массив, поместите их в array и предоставить массив как значение для зависимости.

Это предусмотрено в документации here

1

Вы ищете Авторегистрация (Конфигурация на основе АКА)?

Если да, то на основе выключить пример в разделе 10.1.2 из my book, вы должны быть в состоянии сделать что-то вроде

container.Register(AllTypes 
    .FromAssemblyContaining<PlanOfExecutionComparer>() 
    .BasedOn<IDataComparer>()); 
+1

был просто описываю тот же ответ, но я буду включать [ссылку на документы] (https://github.com/castleproject/Windsor/blob/master /docs/registering-components-by-conventions.md). –

+0

Отлично! Но теперь я получаю проблему разрешающего 'DataImporterService (IList dataValidators, IList dataComparers, IList dataStorages)' Он бросает: 'Компонент Api.Services.DataImporterService имеет зависимость от System.Collections.Generic.IList'1 [Api.Contracts.IDataValidator], который не удалось решить. И я зарегистрировал коллекцию ... – D3athSpank

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

  • Нет связанных вопросов^_^