0

うまくいけば、誰かがそれを理解して助けてくれるかもしれない場所にこれを説明できます:)

とにかく、注入された型からプロパティを取得し、それを別の注入で使用したいと考えています。コントローラーが使用するサービスに注入したい MVC モデルの状態がコントローラー上にあるとします。

public class MyController
{
    public MyController(IService service)
    {
        ....
    }
}

public class MyService : IService
{
    public MyService(IModelStateWrapper modelState)
    {
        ....
    }
}

基本的にこれを達成するにはどうすればよいですか:

public class MyController
{
    public MyController(IService service)
    {
        service.ModelState = new ModelStateWrapper(ModelState);
    }
}

Autofac またはその他の DI コンテナーでの注入の使用。

4

1 に答える 1

1

これを行うことはできますが、可能にする前にいくつかの設計上の問題を解決する必要があります。

まず、IService実装ではIModelStateWrapper、構築中に を渡すだけで、後でコントローラーの作成中に上書きする必要があるようです。IService実装がコンストラクターの要件としてではなく、プロパティとしてのみ持つようにする必要があります。

service.ModelState次に、コントローラの構築直後に設定が行われても問題ないことを確認する必要があります。が設定されていると想定する他のコンストラクター ロジックがある場合service.ModelState、DI では実際には実行できないことがあります。

その解明を行うと、Autofac はかなりクールなことを可能にします。コントローラーの型を登録するときは、型だけでなくラムダを登録します。

var builder = new ContainerBuilder();
builder.RegisterType<MyService>().As<IMyService>();
builder.Register(
    c=>
    {
      var service = c.Resolve<IMyService>();
      var controller = new MyController(service);
      service.ModelState = new ModelStateWrapper(controller.ModelState);
      return controller;
    }).As<IController>();
var container = builder.Build();

循環ロジックは登録のラムダで処理されることに注意してください。コントローラーを解決すると...

var controller = container.Resolve<IController>();

...そのロジックが実行され、探している効果が得られます。

繰り返しになりますが、ここで行われている循環参照について懸念を表明します。コントローラーとサービスの間の循環依存を取り除く方法があれば、DI をうまく機能させることができます。

于 2012-09-17T15:26:35.530 に答える