structuremap怎么装饰?

How decorate in structuremap?

我尝试装饰 IProjectService 但找不到 structuremap 的文档

For<IProjectService>().Use<ProjectServiceLogDecorator>();
For<IProjectService>().Use<ProjectService>()
                      .DecorateWith((context, decorator) =>   
                                  context.GetInstance<ProjectServiceLogDecorator>());

我做错了什么?

异常:

Bi-directional dependency relationship detected! Check the StructureMap stacktrace below: 1.) new ProjectServiceLogDecorator(Default of IRepository, Default of IUnitOfWork, Default of IProjectService, Default of IPrincipal, Default of AuditEventLogger) 2.) Project.Services.Projects.ProjectServiceLogDecorator 3.) Instance of Project.Services.Projects.ProjectServiceLogDecorator 4.) FuncInterceptor of Project.Services.Projects.IProjectService: IContext.GetInstance() 5.) Project.Services.Projects.ProjectService 6.) Instance of Project.Services.Projects.IProjectService (Project.Services.Projects.ProjectService) 7.) new UsersController(Default of IUserService, Default of IService, Default of IUserNotificationService, Default of IService, Default of IProjectService, Default of ILicenseGroupService) 8.) Project.Web.Api.Controllers.UsersController 9.) Instance of Project.Web.Api.Controllers.UsersController 10.) Container.GetInstance(Project.Web.Api.Controllers.UsersController)

我找到了解决方案,但令人作呕:

For<IProjectService>().Use<ProjectService>().DecorateWith((ctx, service) => 
    new ProjectServiceLogDecorator(
        ctx.GetInstance<IRepository<Project>>(),
        ctx.GetInstance<IUnitOfWork>(),
        service,
        ctx.GetInstance<ILicenseService>(),
        ctx.GetInstance<IPrincipal>(),
        ctx.GetInstance<AuditEventLogger>()
    )
);

尽管 no documentation yet, there are a complete set of unit tests 显示了您可以配置装饰器模式的所有不同方式。我相信你想要的是:

For<IProjectService>().DecorateAllWith<ProjectServiceLogDecorator>();
For<IProjectService>().Use<ProjectService>();

您只需执行以下操作即可添加其他装饰器。但是,请注意最外层的装饰器是最后指定的 .DecorateAllWith,因此首先指定最内层的 class 可能更直观。

For<IProjectService>().Use<ProjectService>();
For<IProjectService>().DecorateAllWith<ProjectServiceLogDecorator>();
For<IProjectService>().DecorateAllWith<SomeOtherDecorator>();

这导致:

SomeOtherDecorator
    ProjectServiceLogDecorator
        ProjectService

如果您需要比这更多的控制,您始终可以使用智能实例将构造函数参数显式应用到装饰器(无需显式提供所有参数)。

var projectService = For<IProjectService>().Use<ProjectService>();
For<IProjectService>().Use<ProjectServiceLogDecorator>()
    .Ctor<IProjectService>().Is(projectService);