문제

나는 StructureMap, v. 2.5.3을 사용하고 있으며 데코레이터 패턴을 구현하기 위해 인터페이스에서 함께 구현을 체인하는 데 어려움을 겪고 있습니다.

나는 윈저에 익숙해 져서 인터페이스 구현에서 변형을 지명하고 명명 된 명소를 보낼 수 있습니다. 다른 (기본값) 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());

이것은 INT in 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, 내가 지금 매우 가까운 Windsor로 전환하는 것 외에는)

도움이 되었습니까?

해결책

당신은 매우 가까웠습니다. 노력하다:

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

감사 서비스의 구체적인 유형을 별도로 등록 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top