Я бы рассмотрел Типизированный завод . Вы можете зарегистрировать свои валидаторы с именами «lastnamevalidator» и «dobvalidator». Затем создайте фабричный интерфейс для получения этих конкретных валидаторов. Вам просто нужен интерфейс - средство выполнит реализацию:
public interface IValidatorFactory
{
IValidator GetLastNameValidator();
IValidator GetDobValidator();
}
Теперь передайте фабрику IValidator вашему компоненту. Это также избавляет от необходимости передавать контейнер Windsor (что не очень хорошая идея, поскольку он тесно связывает ваш код с Windsor и усложняет модульное тестирование).
Теперь просто вызовите фабричные методы для доступа к определенному валидатору, в котором нуждается каждый компонент.
UPDATE:
До сих пор неясно, какая часть вашей системы будет определять, какие IValidators использовать, но, возможно, это сработает. Используйте маркерный интерфейс, основанный на IValidator
.
public interface IFileValidator : IValidator
{
}
public interface IUserInputValidator : IValidator
{
}
Теперь пусть ваши валидаторы реализуют интерфейсы маркеров в зависимости от того, где они будут использоваться - и помните, что вы можете реализовать несколько интерфейсов, чтобы валидаторы могли использоваться в разных ситуациях. Пример:
public class FileValidator : IFileValidator
{
public bool IsValid()
{
return false;
}
}
public class DobValidator : IUserInputValidator, IFileValidator
{
public bool IsValid()
{
return false;
}
}
public class LastNameValidator : IUserInputValidator
{
public bool IsValid()
{
return true;
}
}
Измените заводской интерфейс, чтобы он возвращал только определенные типы валидаторов:
public interface IValidatorFactory
{
IFileValidator[] GetFileValidators();
IUserInputValidator[] GetUserInputValidators();
}
Теперь зарегистрируйте валидаторы, соответствующие их «типу». Если валидатор имеет многократное использование, обязательно добавьте определение .Forward<>
для Windsor:
var container = new WindsorContainer();
container.AddFacility<TypedFactoryFacility>();
container.Register(
Component.For<IValidatorFactory>().AsFactory(),
Component.For<IFileValidator>().ImplementedBy<FileValidator>(),
Component.For<IUserInputValidator>().ImplementedBy<LastNameValidator>(),
Component.For<IFileValidator>().Forward<IUserInputValidator>().ImplementedBy<DobValidator>()
);