2009-09-18 17 views
14

Sto utilizzando StructureMap, v. 2.5.3 e sto avendo problemi con il concatenamento di implementazioni su un'interfaccia per implementare il pattern Decorator.StructureMap e il motivo decoratore

Sono abituato a Windsor, dove è possibile assegnare un nome alle varianti delle implementazioni dell'interfaccia e inviare il nome impl. in un altro (predefinito) impl.

questo è il default, versione non decorata, che funziona bene:

ObjectFactory.Initialize(registry => 
{ 
    registry.ForRequestedType<ICommentService() 
    .TheDefault.Is.OfConcreteType<CommentService>(); 
... } 

Questa è la ctor sul decoratore, che voglio chiamare:

public CommentAuditService(ICommentService commentService, 
          IAuditService auditService) 

Questo funziona, ma fa non concedermi l'accesso all'oggetto decorato:

registry.ForRequestedType<ICommentService>() 
    .TheDefault.Is.OfConcreteType<CommentService>() 
    .EnrichWith(x => new CommentAuditService()); 

Questo mi richiede un inf. ciclo:

registry.ForRequestedType<ICommentService>() 
    .TheDefault.Is.OfConcreteType<CommentService>() 
    .EnrichWith(x => new CommentAuditService(new CommentService(), 
              new AuditService())); 

Finora questo è ciò che mi sembra dovrebbe lavoro:

registry.ForRequestedType<ICommentService.() 
    .TheDefault.Is.OfConcreteType<CommentAuditService>() 
    .WithCtorArg("commentService") 
    .EqualTo(new CommentService()); 

Tuttavia inviarlo in un ciclo infinito di creazione di nuove istanze di CommentAuditService

Qualcuno ha una risposta veloce? (oltre al passaggio a Castle.Windsor, che sono molto vicino al momento)

risposta

21

Eri molto vicino. Prova:

registry.ForRequestedType<ICommentService>() 
    .TheDefaultIsConcreteType<CommentService>() 
    .EnrichWith(original => new CommentAuditService(original, 
             new AuditService())); 

Se AuditService potrebbe per sé le dipendenze, si farebbe:

registry.ForRequestedType<ICommentService>() 
    .TheDefaultIsConcreteType<CommentService>() 
    .EnrichWith((ioc, original) => new CommentAuditService(original, 
            ioc.GetInstance<AuditService>())); 

Oppure, se si cambia l'ultima parte a:

ioc.GetInstance<IAuditService>() 

è possibile registrare il tipo concreto del servizio di revisione separatamente.

+0

Questo è il biglietto! Grazie Joshua – iammaz