2016-12-15 7 views
0

я следующий классТип не разрешения на нескольких заводах

public class NightlyJob : IScheduleJob, IRecurringJob 

Для обоих интерфейсов у меня есть простые типизированные фабрики, как это:

public interface IScheduleJobFactory 
{ 
    IEnumerable<IScheduleJob> Create(); 
} 

Упомянутый класс не извлекается из обоих заводов. Create() методов. Кажется, что класс можно получить только с одного завода, в зависимости от того, какой из интерфейсов в сигнатуре записывается первым.

Мой вопрос в том, есть ли способ обойти это?

+0

Зачем вам нужен завод? Они [запахи кода] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100). – Steven

+0

Замкнутая фабрика замка казалась самым простым способом. Все, что мне нужно сделать, это получить реализацию интерфейса и выбрать один с соответствующим свойством. – zmaten

+0

Почему бы не ввести 'IEnumerable ' в ваш потребитель (ы)? – Steven

ответ

0

После некоторого поиска в направлении, предложенном Стивеном в комментариях. Я нашел свое решение для инъекций IEnumerable<IScheduleJob> и IEnumerable<IRecurringJob> непосредственно потребителям. Они разрешаются как коллекции реализаций, используя Касл CollectionResolver так:

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 
     container.Register(
      Classes.FromAssemblyInDirectory(new AssemblyFilter(".")) 
       .BasedOn(typeof(IScheduleJob)). 
       WithServiceAllInterfaces() 
     );