문제
나는 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>()
감사 서비스의 구체적인 유형을 별도로 등록 할 수 있습니다.
제휴하지 않습니다 StackOverflow