2009-09-18 11 views
14

Używam StructureMap, v. 2.5.3 i mam problemy z łączeniem ze sobą implementacji interfejsu w celu implementacji wzorca dekoratora.StructureMap i wzór dekoratora

Jestem przyzwyczajony do Windsor, gdzie możliwe jest nadanie nazw wersjom implementacji interfejsu i wysłanie nazwanego imp. do innego (domyślnie) imp.

Jest to ustawienie domyślne, nie wersja urządzone, który działa dobrze:

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

Jest to konstruktor na dekoratora, który chcę zadzwonić:

public CommentAuditService(ICommentService commentService, 
          IAuditService auditService) 

To działa, ale nie nie daje mi dostępu do udekorowanego obiektu:

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

To zajmie mi int inf. Pętla:

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

Jak dotąd jest to, co wydaje mi się powinien praca:

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

jednak wysłać go do nieskończonej pętli tworzenia nowych instancji CommentAuditService

Czy ktoś ma szybka odpowiedź? (inne niż przejście do Castle.Windsor, które obecnie jest mi bliskie)

Odpowiedz

21

Byłeś bardzo blisko. Spróbuj:

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

Jeśli AuditService może sam mieć zależności, zrobiłbyś:

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

Lub, jeśli zmienisz ostatnią część do:

ioc.GetInstance<IAuditService>() 

można zarejestrować konkretny typ usługi audytu osobno.

+0

To jest bilet! Dzięki Joshua – iammaz