我正在使用StructureMap,v.2.5.3,并且无法将接口上的实现链接在一起以实现Decorator模式。
我已经习惯了Windsor,可以在接口实现上命名变体并发送命名的impl。进入另一个(默认)impl。
这是默认的非装饰版本,工作正常:
ObjectFactory.Initialize(registry =>
{
registry.ForRequestedType<ICommentService()
.TheDefault.Is.OfConcreteType<CommentService>();
... }
这是装饰器上的ctor,我想打电话:
public CommentAuditService( ICommentService commentService,
IAuditService auditService )
这样可行,但不允许我访问装饰对象:
registry.ForRequestedType<ICommentService>()
.TheDefault.Is.OfConcreteType<CommentService>()
.EnrichWith(x => new CommentAuditService());
这需要我一个inf。循环:
registry.ForRequestedType<ICommentService>()
.TheDefault.Is.OfConcreteType<CommentService>()
.EnrichWith(x => new CommentAuditService( new CommentService(),
new AuditService()));
到目前为止,这似乎是我应该的工作:
registry.ForRequestedType<ICommentService.()
.TheDefault.Is.OfConcreteType<CommentAuditService>()
.WithCtorArg("commentService")
.EqualTo(new CommentService());
然而,它将它发送到创建CommentAuditService
的新实例的无限循环中有人有快速回答吗? (除了切换到Castle.Windsor,我现在非常接近)
答案 0 :(得分:21)
你非常接近。尝试:
registry.ForRequestedType<ICommentService>()
.TheDefaultIsConcreteType<CommentService>()
.EnrichWith(original => new CommentAuditService(original,
new AuditService()));
如果AuditService本身可能具有依赖关系,您可以执行以下操作:
registry.ForRequestedType<ICommentService>()
.TheDefaultIsConcreteType<CommentService>()
.EnrichWith((ioc, original) => new CommentAuditService(original,
ioc.GetInstance<AuditService>()));
或者,如果您将最后一部分更改为:
ioc.GetInstance<IAuditService>()
您可以单独注册审计服务的具体类型。