StructureMap和装饰器模式

时间:2009-09-18 09:30:54

标签: structuremap

我正在使用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,我现在非常接近)

1 个答案:

答案 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>()

您可以单独注册审计服务的具体类型。