Domanda

Sto usando StructureMap, v. 2.5.3 e ho problemi a concatenare implementazioni su un'interfaccia per implementare il modello Decorator.

Sono abituato a Windsor, dove è possibile nominare le variazioni sulle implementazioni dell'interfaccia e inviare il nome impl. in un'altra (predefinita) impl.

Questa è la versione predefinita, non decorata, che funziona bene:

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

Questo è il direttore del decoratore, che voglio chiamare:

public CommentAuditService( ICommentService commentService, 
                            IAuditService auditService )

Funziona, ma non mi dà accesso all'oggetto decorato:

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

Questo mi porta in un inf. loop:

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

Finora questo è ciò che mi sembra dovrebbe funzionare:

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

Tuttavia, lo invia in un ciclo infinito di creazione di nuove istanze di CommentAuditService

Qualcuno ha una risposta rapida? (a parte il passaggio a Castle.Windsor, a cui sono molto vicino in questo momento)

È stato utile?

Soluzione

Eri molto vicino. Prova:

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

Se AuditService potrebbe avere delle dipendenze, dovresti farlo:

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

Oppure, se si modifica l'ultima parte in:

ioc.GetInstance<IAuditService>()

puoi registrare separatamente il tipo concreto del tuo servizio di audit.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top