2009-09-18 26 views
14

Estoy usando StructureMap, v. 2.5.3 y tengo problemas para encadenar implementaciones en una interfaz para implementar el patrón Decorator.StructureMap y el patrón de decorador

Estoy acostumbrado a Windsor, donde es posible nombrar variaciones en implementaciones de interfaz y enviar el nombre impl. en otro (predeterminado) impl.

Este es el valor predeterminado, versión no decorada, que funciona bien:

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

Esta es la ctor del decorador, que yo quiero llamar a:

public CommentAuditService(ICommentService commentService, 
          IAuditService auditService) 

Esto funciona, pero lo hace no me da acceso al objeto decorado:

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

Esto me lleva int. inf. loop:

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

Hasta el momento esto es lo que me parece debe trabajo:

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

Sin embargo se envía en un bucle sin fin de crear nuevas instancias de CommentAuditService

¿Alguien tiene una respuesta rápida? (aparte de cambiar a Castle.Windsor, que estoy muy cerca en este momento)

Respuesta

21

Estabas muy cerca. Proveedores:

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

Si AuditService podría tener por sí mismo dependencias, puede hacer:

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

O, si cambia la última parte de:

ioc.GetInstance<IAuditService>() 

puede registrar el tipo concreto de su servicio de auditoría por separado.

+0

¡Ese es el boleto! Gracias Joshua – iammaz

Cuestiones relacionadas