2011-01-03 25 views
2

私たちの製品のいくつかの新しい汎用認証フレームワークを設計する際に、私は良い解決策を見つけることができないような建築上の問題に遭遇しました。ASP.NETモジュール依存性注入

私は問題を簡単に説明するために問題を簡素化しようとしました。

ライブラリーは、2つのクラスがあります。

マネージャーは、現在認証されたユーザーを格納するための責任があります。

モジュールモジュールはセキュリティポリシーに従って各要求を検証する責任があります。モジュールは、ユーザーが現在認証されているかどうかを決定するようにマネージャに依頼する必要があります。

これで、マネージャには、マネージャがリポジトリからユーザをロードできるようにするインターフェイスの実装が提供されました。特定の実装はこのライブラリに含まれていません。このため、私はライブラリ内のリポジトリのインスタンスを直接インスタンス化することはできません。

モジュールのコンストラクタのプロパティを変更したり、引数を指定したりする方法がありません。だから私の質問はこれです、どのようにモジュールにManagerのインスタンスへの参照を与えることができますか?古典的なASP.NETで

namespace Demo 
{ 
    public interface IRepository 
    { 
     object GetUser(int id); 
    }

public class Manager { public IRepository Repository { get; private set; } public Manager(IRepository repository) { this.Repository = repository; } } public class Module : IHttpModule { // How can i access an instance of the manager class here // when I am unable to instantiate an instance of // of an implementation of the IRepository interface. }

}

+1

必要なものをやるべきだと思うあなたが何をしようとして証明するためにいくつかの擬似コードの実装を投稿することができますか? –

答えて

2

、Iは必要な依存関係を宣言し、私HttpApplicationGlobal)上のインターフェイスを実装することを好みます。ここでは、(アプリがlolcatsによって書かれた)IHasManagerです:最も簡単なの

public class Module: IHttpModule { 
    Manager manager; 
    public void Init(HttpApplication context) { 
     IHasManager application = context as IHasManager; 
     if (application != null) { 
      manager = application.Manager; 
     } 
    } 
} 
0

ワン(醜い場合)の方法はされているアプリケーションの辞書にあなたのマネージャーのインスタンスを詰め込むためにあなたがそれを作成した後:

HttpContext.Current.Application["Demo.Manager"] = new Manager(new Repository()); 

これでモジュール内で次のようにアクセスできます:

var manager = HttpContext.Current.Application["Demo.Manager"] as Manager;