Цепочка классов StructureMap - переполнение стека или другие ошибки - PullRequest
0 голосов
/ 17 сентября 2009

Это полностью сбило меня с толку в ряде конфигураций. Я продолжаю читать документацию, и я просто не понимаю. Вот мой регистрационный код:

ForRequestedType<SimpleWorkItemProcessor>().TheDefault.Is.OfConcreteType<SimpleWorkItemProcessor>();

ForRequestedType<WorkItemRetryProcessor>().TheDefault.Is.OfConcreteType<WorkItemRetryProcessor>()
    .CtorDependency<IWorkItemProcessor>().Is(x => x.OfConcreteType<SimpleWorkItemProcessor>())
    .WithCtorArg("busyDelay").EqualTo(TimeSpan.FromMilliseconds(20))
    .WithCtorArg("overallTimeout").EqualTo(TimeSpan.FromSeconds(60));

ForRequestedType<WorkItemQueue>().TheDefault.Is.OfConcreteType<WorkItemQueue>()
    .CtorDependency<IWorkItemProcessor>().Is(x => x.OfConcreteType<WorkItemRetryProcessor>());

Как таковой, он говорит, что для IWorkItemProcessor нет экземпляра по умолчанию (что правильно). Переключение последней строки на это:

ForRequestedType<IWorkItemProcessor>().TheDefault.Is.OfConcreteType<WorkItemQueue>()
    .CtorDependency<IWorkItemProcessor>().Is(x => x.OfConcreteType<WorkItemRetryProcessor>());

... Создает исключение переполнения стека.

Как вы объединяете классы, которые реализуют интерфейс и используют тот же интерфейс в своем конструкторе?

1 Ответ

0 голосов
/ 18 сентября 2009

Это работает, но я не могу объяснить, почему. Из того, что я знаю, первая версия должна работать так же хорошо.

ForRequestedType<SimpleWorkItemProcessor>().TheDefault.Is.OfConcreteType<SimpleWorkItemProcessor>();

var retryProcessor = ForRequestedType<WorkItemRetryProcessor>().TheDefault.Is.OfConcreteType<WorkItemRetryProcessor>()
    .CtorDependency<IWorkItemProcessor>().Is(x => x.OfConcreteType<SimpleWorkItemProcessor>())
    .CtorDependency<TimeSpan>("busyDelay").Is(x => x.Object(TimeSpan.FromMilliseconds(20)))
    .CtorDependency<TimeSpan>("overallTimeout").Is(x => x.Object(TimeSpan.FromSeconds(60)));

ForRequestedType<IWorkItemProcessor>().TheDefault.Is.OfConcreteType<WorkItemQueue>()
    .CtorDependency<IWorkItemProcessor>("workItemProcessor").Is(x => x.Instance(retryProcessor));
...