0

レイヤード アーキテクチャの Entity Framework での私の質問に対する回答に基づいて、リポジトリ (ビジネス ロジックではなく CRUD 抽象化のみを担当) を DAL に移動し、ビジネス ロジック用に BLL を予約します。
エンティティ コンテキストは作業単位と見なす必要があるため、再利用すべきではないという結論に達しました。したがって、リポジトリで HttpContext ごとに obejctcontext を作成して、パフォーマンス/スレッドの [un]safe 問題を回避したいと考えています。次のように、リポジトリで objectcontext を定義したいと思います。

public MyDBEntities ctx
    {
        get
        {
            string ocKey = "ctx_" + HttpContext.Current.GetHashCode().ToString("x");
            if (!HttpContext.Current.Items.Contains(ocKey))
                HttpContext.Current.Items.Add(ocKey, new MyDBEntities ());
            return HttpContext.Current.Items[ocKey] as MyDBEntities ;
        }
    }

その場合、DAL プロジェクトは HttpContext.Current 変数を認識する必要があります。これが良い習慣かどうかはわかりませんが、あなたの意見を知りたいです。

4

1 に答える 1

2

Web アプリケーションの外部で HttpContext にアクセスしないことは、コードを Web 環境に密接に結合するため、悪い習慣です。あなたが探しているのは、おそらく、HTTP 要求オブジェクトごとのライフタイム マネージャーを使用したコントロール コンテナーの反転です。

ビジネス ロジックを次のように定義するとします。

public class BusinessService : IBusinessService
{ 
  // Constructor with dependency injection
  public BusinessService(IObjectContext context)
  { ... }

  ...
}

BusinessService を使用する場合は、そのインスタンスを作成し、IObjectContext をパラメーターとして渡す必要があります。コントロール コンテナーの反転を使用する場合、この定義を利用して、コンストラクターの代わりに次のようなものを呼び出すことができます。

IBusinessService service = container.Resolve<IBusinessService>();

IBusinessService と IObjectContext の具体的な実装をインスタンス化できるように、制御の反転 (IoC) コンテナーを構成する必要があります。さらに、この構成では通常、インスタンス化されたオブジェクトの有効期間を定義できます。HTTP ライフタイムごとに許可されている場合、単一のリクエスト内の Resolve への各呼び出しは同じインスタンスを返します。

ビジネス サービスを使用してコンテナにクラスを解決させることで、さらに先に進むことができます。通常、ASP.NET MVCで実行されます。このような場合、サービスを受け取るコンストラクターのみをメイン クラス (コントローラー) のパラメーターとして定義し、IoC コンテナーにオブジェクト階層全体を構築させます。

コントロール コンテナーの反転については、たとえばWindsor Castleを確認してください。MS Unity を使用していますが、そのままでは HTTP ライフタイム マネージャーごとに提供されません。

于 2011-01-06T09:57:42.300 に答える