StructureMap e il motivo del decoratore
-
22-07-2019 - |
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)
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.