2015-07-30 5 views
6

Я стараюсь это украсить IProjectService, но я не могу найти документацию для struturemapКак украсить в структуре карту?

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

Что я делаю не так?

Exeption: обнаружена связь

Двунаправленный зависимость! Проверьте StructureMap StackTrace ниже: 1.) новый ProjectServiceLogDecorator (По умолчанию из IRepository, По умолчанию из IUnitOfWork, По умолчанию из IProjectService, По умолчанию из IPrincipal, По умолчанию из AuditEventLogger) 2.) проекта. Services.Projects.ProjectServiceLogDecorator 3.) Экземпляр Project.Services.Projects.ProjectServiceLogDecorator 4.) FuncInterceptor из Project.Services.Projects.IProjectService: IContext.GetInstance() 5.) Project.Services.Projects.ProjectService 6 .) Instanc е Project.Services.Projects.IProjectService (Project.Services.Projects.ProjectService) 7.) новый UsersController (Дефолт IUserService, Дефолт IService, Дефолт IUserNotificationService, Дефолт IService, Дефолт IProjectService, Дефолт ILicenseGroupService) 8.) Project.Web.Api.Controllers.UsersController 9.) инстанции 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>() 
    ) 
); 
+0

Я думаю, вам нужно 'DecorateAllWith'. Связано это: https://stackoverflow.com/questions/25134096/structuremap3-decorateallwith – Steven

+0

Мне нужен один к одному – Mediator

ответ

4

Хотя есть no documentation yet, есть полный набор unit tests показывает все различные способы, которые вы можете настроить шаблон декоратора. Я считаю, что один из них:

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

Вы можете добавить дополнительные декораторы, просто выполнив следующее. Однако обратите внимание, что внешний декоратор является последним .DecorateAllWith, поэтому может быть более интуитивным сначала указать самый внутренний класс.

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);