2016-06-29 3 views
0

Рассмотрим следующий набор классов:Возможно ли зарегистрировать все зависимости и только зависимости данного класса с установщиком Castle Windsor?

public interface IService { } 
public interface IDep1 { } 
public interface IDep2 { } 
public interface IDep3 { } 

public class Dep1 : IDep1 { } 
public class Dep2 : IDep2 { } 
public class Dep3 : IDep3 { } // this one is not used 

public class Service1 : IService 
{ 
    public Service1(IDep1 dep1) { } 
} 
public class Service2 : IService 
{ 
    public Service2(IDep1 dep1, IDep2 dep2) { } 
} 

Я использую следующий замок Виндзор установщику, чтобы зарегистрировать все классы, которые наследуют от IService:

container.Register(Classes.FromThisAssembly() 
    .BasedOn(typeof(IService)) 
    .WithServiceSelf() 
    .WithServiceBase() 
    .LifestyleTransient()); 

Как я могу написать инсталлятор, который будет зарегистрируйте все классы, которые являются зависимостями уже зарегистрированных классов, но не более того. Другими словами: Как я могу написать универсальный инсталлятор, который будет регистрировать IDep1 и IDep2, но не IDep3 (потому что IDep3 не используется какой-либо IService

+2

Почему вы держите IDep3 в вашем коде если он не используется? – Paolo

+1

Почему имеет значение, если класс зарегистрирован, но не используется? – stuartd

+0

Потому что Dep3 используется в другом месте, и я не хочу, чтобы он находился в контейнере. – Eiver

ответ

1

Вы можете попробовать фильтрации? типы с .Where.

container.Register(Classes.FromThisAssembly() 
    .BasedOn(typeof(IService)) 
    .WithServiceSelf() 
    .WithServiceBase() 
    .Where(type => !(type is IDep3)) 
    .LifestyleTransient()); 

See documentation

Но он чувствует ко мне, что делать так «пахнет» - Может быть, есть еще один интерфейс IDep1 и IDep2 унаследует от а IDep3 не будет, и сделать регистрацию по этому интерфейсу

+0

Согласен, однако, я полагаю, что OP желает условно зарегистрировать типы на основе того, действительно ли они используются какой-либо реализацией IService. –

+0

Я тоже так подумал, но Castle действительно не работает таким образом ... так решил просто дать эту возможность + мои проблемы –

+0

Я определенно не хочу вручную исключать IDep3. Я скорее хочу посетить конструктор, пройти все аргументы и зарегистрировать эти типы и повторить рекурсивно. Мой вопрос: я должен сделать это вручную или есть какой-то сложный способ сказать Замку сделать это для меня? – Eiver

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

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