2

Castle Windsor は初めてで、最新バージョンを使用しています。正常に動作しているリポジトリのエントリを作成しましたが、コントローラーに渡す最後の依存関係が 1 つあります。

IValidationDictionary を継承する ModelStateWrapper を作成しました。ModelStateWrapper はコンストラクターで ModelStateDictionary を受け取るため、私のコードでは例として次を渡すことができます。

IMembershipService _memSvc;
IValidationDictionary _validationService;

public AccountController()
{
    _validationService = new ModelStateWrapper(this.ModelState);
    _memSvc = new MembershipService(_validationService);
}

私のテストでは、Moq を使用してこれを行うことができます。

var v = new Mock<ModelStateDictionary>();
_validationService = new ModelStateWrapper(v.Object);
_service = new MembershipService(_validationService);

Castle に ModelStateWrapper を使用して ModelState を注入させることができないようです。Castle が依存関係を検索し、依存関係が残っているというエラーをスローするため、「無視」して手動で注入しようとすることはできないようです。

IValidationDictionary に基づいて ModelStateWrapper を使用し、コンストラクターのパラメーターとして ModelState を含めるように Castle Windsor を構成するにはどうすればよいですか?

ロイド

4

2 に答える 2

1

循環依存関係があるようです (決して良いことではありません)。この非常によく似た質問で説明されているように、 Abstract Factoryを使用して回避できます。

ただし、このような問題を解決できる場合もありますが、API を再設計して循環依存をなくした方がよいでしょう。循環依存は、多くの場合、設計上の欠陥を示しています。

于 2010-01-16T11:01:30.983 に答える
0

あなたはそれを間違ってやっています、そしてあなたの間違ったことはあなたが使っているコンテナとは何の関係もありません。

どうしても必要な場合は、このようにしてください。

public AccountController(IValidationService service)
{
    _validationService = service;
    _memSvc = new MembershipService(_validationService); 
}

次に、コンポーネントを登録するときに、OnCreateメソッドを使用します。

container.Register(
   Component.For<AccountController>()
   .WheveverEleseYouNeedHere()
   .OnCreate((k, controller) => 
      controller.ValidationService.Init(controller.ModelState)));
于 2010-01-16T13:09:03.733 に答える