МОК по IValidationDictionary с замком Виндзор - PullRequest
2 голосов
/ 16 января 2010

Я новичок в замке Виндзор и просто использую последнюю версию. Я создал записи для своих репозиториев, которые работают нормально, но у меня есть одна последняя зависимость, которую я передаю в свой контроллер.

Я создал ModelStateWrapper, который наследуется от IValidationDictionary. ModelStateWrapper принимает ModelStateDictionary в своем конструкторе, так что в моем коде я могу передать следующее в качестве примера:

IMembershipService _memSvc;
IValidationDictionary _validationService;

public AccountController()
{
    _validationService = new ModelStateWrapper(this.ModelState);
    _memSvc = new MembershipService(_validationService);
}

В моих тестах я могу сделать это, используя Moq:

var v = new Mock<ModelStateDictionary>();
_validationService = new ModelStateWrapper(v.Object);
_service = new MembershipService(_validationService);

Я не могу заставить Касла внедрить ModelState с помощью ModelStateWrapper. Я понятия не имею, с чего начать, и кажется, что я не могу просто «проигнорировать это» и попробовать ввести вручную, поскольку Касл ищет зависимости и выдает мне сообщение о том, что зависимость остается.

Как настроить Castle Windsor для использования ModelStateWrapper на основе IValidationDictionary, а также для включения ModelState в качестве параметра конструктора?

Lloyd

Ответы [ 2 ]

1 голос
/ 16 января 2010

Кажется, у вас круговая зависимость (никогда не бывает хорошей вещью). Вы можете обойти это, используя Abstract Factory как , описанный в этом очень похожем вопросе .

Однако, хотя вы можете решить эту проблему следующим образом, было бы лучше перепроектировать API, чтобы исключить циклическую зависимость. Круговые зависимости часто указывают на недостаток конструкции.

0 голосов
/ 16 января 2010

Вы делаете это неправильно, и ваши нарушения не имеют ничего общего с контейнером, который вы используете.

Просто сделайте это так, если вам абсолютно необходимо:

public AccountController(IValidationService service)
{
    _validationService = service;
    _memSvc = new MembershipService(_validationService); 
}

затем, когда вы регистрируете свой компонент, используйте метод OnCreate:

container.Register(
   Component.For<AccountController>()
   .WheveverEleseYouNeedHere()
   .OnCreate((k, controller) => 
      controller.ValidationService.Init(controller.ModelState)));
...