2009-09-18 10 views
14

私はStructureMap、v.2.5.3を使用していますが、デコレータパターンを実装するためにインタフェース上で実装を連鎖させることに問題があります。StructureMapとデコレータパターン

私はウィンザーに慣れています。ここでは、インターフェース実装のバリエーションを指定して名前付きインプットを送信することができます。別の(デフォルト)インプットに変換します。

これはデフォルトで、正常に動作します非飾られたバージョン:

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

ループ:

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に切り替える以外、私は現時点で非常に近くにいる)

答えて

21

あなたはとても近くでした。試してみてください:

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

あなたが具体的なタイプを登録することができますがあなたの監査サービスの

+0

チケットがあります!ありがとうジョシュア – iammaz

関連する問題