1

コード例は次のとおりです。

public interface IService<TEntity> {        
        IContext Context { get; set; }
        //unimportant methods
        bool Validate(TEntity entity);
        void Add(TEntity enttity);
    }

 public class UsersController : Controller {
        private IService<User> _service;
        public MyController(IService<User> service){
            _service = service;
            _service.Context = ControllerContext;
        }
    }

ASP.NET MVC アプリでコントローラーを作成するために AutofacControllerFactory を使用しています。すべてのコントローラーのコンストラクターでこのコード行を削除することは可能ですか:

_service.Context = ControllerContext;

つまり、このプロパティを ControllerContext で自動的に設定することは可能ですか? すべての IService 実装には設定可能な IContext プロパティがあるため、これが可能になるはずです。

AutofacControllerFactory を拡張する必要がありますか、またはこれを行う標準的な方法はありますか?

4

1 に答える 1

2

あなたが持っているのは循環依存です。

  • UsersControllerに依存しますIService<User>
  • IService<User>に依存しますControllerContext
  • ControllerContextに依存しますUsersController

DIコンテナは、クラスの内部に到達して、そこで何が起こるかを制御することはできません。彼らはあなたのために依存関係を設定し、外部からあなたのクラスにそれらを注入することができます。ただし、循環依存関係をうまく処理できないため、APIを再設計することをお勧めします。

IService<TEntity>ここからは、のContextプロパティがLeakyAbstractionであるように見えます。サービスは、それが実行されているUIフレームワークについて何も知る必要はありません。

多くの場合、コンシューマーの1つをよりイベント駆動型のアーキテクチャーに変更することで、循環依存関係を解消できます。

この種の問題に関する記事があります

ASP.NET MVCの質問に対する関連する回答は次のとおりです。ASP.NETMVCのContactsManagerチュートリアルで、依存性注入ループの問題を解決するための適切な方法はありますか?

答えも参照してください:依存性-循環依存性を解決するための注入

于 2010-07-19T14:54:47.603 に答える