2015-07-30 21 views
6

I spróbować ozdobić IProjectService ale nie mogę znaleźć dokumentację dla struturemapJak dekorować w strukturze?

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

Co robię źle?

exeption: Wykryto

Dwukierunkowy związek zależność! Sprawdź StackTrace StructureMap poniżej: 1.) nowy ProjectServiceLogDecorator (domyślnej IRepository, domyślnej IUnitOfWork, domyślnej IProjectService, domyślnej IPrincipal, domyślnej AuditEventLogger) 2.) Project. Services.Projects.ProjectServiceLogDecorator 3) Instancja Project.Services.Projects.ProjectServiceLogDecorator 4) FuncInterceptor z Project.Services.Projects.IProjectService: IContext.GetInstance() 5.) Project.Services.Projects.ProjectService 6 .) Instanc E Project.Services.Projects.IProjectService (Project.Services.Projects.ProjectService) 7) New UsersController (Domyślna IUserService, Domyślna IService, Domyślna IUserNotificationService, Domyślna IService, domyślna IProjectService, domyślna ILicenseGroupService) 8) Project.Web.Api.Controllers.UsersController 9) Instancja Project.Web.Api.Controllers.UsersController 10) Container.GetInstance (projekt. Web.Api.Controllers.UsersController)

Znalazłem rozwiązanie, ale jest obrzydliwie:

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

Myślę, że potrzebujesz 'DecorateAllWith'. Powiązane: https://stackoverflow.com/questions/25134096/structuremap3-decorateallw – Steven

+0

Potrzebuję jeden do jednego – Mediator

Odpowiedz

4

Chociaż istnieje no documentation yet istnieje kompletny zestaw unit tests pokazywanie wszystkich różnych sposobów można skonfigurować wzorzec dekoratora. Wierzę, że chcesz:

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

Możesz dodać kolejnych dekoratorów, wykonując następujące czynności. Należy jednak zauważyć, że najbardziej zewnętrzny dekorator jest ostatnim określonym parametrem, więc może być bardziej intuicyjne określenie najpierw najgłębszej klasy.

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

co skutkuje:

SomeOtherDecorator 
    ProjectServiceLogDecorator 
     ProjectService 

Jeśli potrzebujesz więcej kontroli niż to, zawsze można użyć inteligentnych instancje zastosować parametry konstruktora dekoratora wprost (bez konieczności dostarczenia wszystkich parametrów wyraźnie) .

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