2009-09-17 6 views
0

Cela m'a complètement dérouté sur un certain nombre de configurations. Je continue à lire la documentation, et je ne comprends tout simplement pas. Voici mon code d'enregistrement:StructureMap Class Chaining - Stack Overflow ou d'autres erreurs

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>()); 

Comme il est, il dit qu'il n'y a pas d'instance par défaut pour IWorkItemProcessor (ce qui est correct). Basculer la dernière ligne à ceci:

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

... Fait une exception de dépassement de pile.

Comment enchaînez-vous les classes qui implémentent une interface et acceptent cette même interface dans leur constructeur?

Répondre

0

Cela fonctionne, mais je ne peux pas expliquer pourquoi. D'après ce que je sais, la première version devrait fonctionner aussi bien.

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)); 
Questions connexes