11

これまで、Nerddinner や ContactManager などの単純なアプリケーションだけでなく、Kigg などのより複雑なアプリケーションも調べてきました。私はより単純なものを理解していますが、今はより複雑なものを理解したいと思っています。

通常、より単純なアプリケーションには、LINQtoSQL または Entity Framework の上にリポジトリ クラスとインターフェイス (できる限り疎結合) があります。リポジトリは、必要なデータ操作を行うためにコントローラーから呼び出されます。

Kigg や Oxite などのより複雑なアプリケーションを調べるときによく目にするパターンの 1 つに、次のようなものがあります (ここでは表面をなぞっただけですが、どこかから始めなければなりません)。

  • IOC DI (Kigg の場合は Unity)
  • Web リクエスト ライフタイム マネージャー
  • 作業単位

ここに私の質問があります:

本当に疎結合のアプリケーションを作成するには、Unity のようなものを使用する必要があることを理解しています。しかし、Unity をミックスに導入した瞬間に、Web Request Lifetime Manager も導入する必要があるようにも思えます。何故ですか?Nerdinner のようなサンプル アプリケーションに Web Request Lifetime Manager がないのはなぜですか? それは正確に何をしますか?Unity固有のものですか?

私が気付く 2 番目のパターンは、Unit of Work の導入です。繰り返しますが、同じ質問です。Nerddinner または ContactManager が Unit of Work を使用しないのはなぜですか? 代わりに、これらのアプリケーションは、Linq2Sql または Entity Framework の上にあるリポジトリ クラスを使用してデータ操作を行います。作業単位の兆候はありません。それは正確には何であり、なぜそれを使用する必要があるのですか?

ありがとう

以下は、DinnersController レベルでの Nerddiner の DI の例です。

    public DinnersController()
        : this(new DinnerRepository()) {
    }

    public DinnersController(IDinnerRepository repository) {
        dinnerRepository = repository;
    }

したがって、最初のコンストラクターのためにコントローラーがDinnerRepositoryを「所有」しているため、そこで宣言されているため、コントローラーの寿命に依存すると仮定するのは正しいですか?

4

2 に答える 2

3

Linq-to-SQL を直接使用すると、コントローラーがデータ コンテキストへの参照を所有します。これは通常、コントローラー内のプライベート参照であるため、その構築の一部として作成されます。一箇所にあるので生涯管理する必要はありません。

ただし、IoC コンテナーを使用すると、データ リポジトリはコントローラーの外部に作成されます。オブジェクトを作成する IoC コンテナーは、作成されたオブジェクトをどのように、どのくらいの期間使用するかを知らないため、ライフタイム戦略が導入されています。

たとえば、データ コンテキスト (リポジトリ) は通常、Web 要求の最初に作成され、最後に破棄されます。ただし、外部の Web サービスや一部の静的マッパー (ロガーなど) で動作するコンポーネントについては、毎回作成する必要はありません。したがって、それらを一度作成するように言いたい場合があります (つまり、シングルトーン ライフスタイル)。

これはすべて、IoC コンテナー (Unity など) が多くの状況を処理するように設計されており、特定のニーズを認識していないために発生します。たとえば、一部のアプリケーションでは、NHibernate (または Entity Framework) が複数のページ/Web 要求の間続く「会話」トランザクションを使用します。IoC コンテナーを使用すると、ニーズに合わせてオブジェクトの有効期間を微調整できます。しかし、前述のように、これには代償が伴います。事前に定義された戦略は 1 つもないため、自分で選択する必要があります。

NerdDinner やその他のアプリケーションがより高度な手法を使用しない理由は、それらが MVC 機能を示すことを目的としており、他のライブラリの高度な使用法を意図していないためです。1 つの IoC コンテナーの高度な機能を説明するために書かれた記事を覚えています。単純な MVC デモ アプリケーションと同じです。MVC の初心者であるあなたが IoC の迷宮で迷子になることを望んでいません。

また、デザインの参考例として Oxite を見ることはお勧めしませ 。 ayende.com/Blog/archive/2008/12/19/oxite-open-exchangable-informative-troubled-engine.aspx

于 2009-09-26T17:46:59.507 に答える
0

すべてではないにしてもほとんどの DI コンテナーがライフタイムの概念に触れていると思います。関連するシナリオに応じて、コンテナーが登録済みコンポーネントの同じインスタンスを常に返すようにしたい場合がありますが、別のコンポーネントの場合は常に新しいインスタンスを返したい場合があります。ほとんどのコンテナーでは、特定のコンテキスト内で同じインスタンスを返すように指定することもできます。

Unity についてはよくわかりませんが (これまでは Windsor と Autofac を使用してきました)、Web リクエスト ライフタイム マネージャーは、単一の Web の存続期間中にコンテナーによって同じインスタンスが提供されるライフタイム戦略の実装であると思われます。リクエスト。Windsor のようなコンテナにも同様の戦略があります。

最後に、Unit of Work について言及していると思います。Unit of Work は、基本的に、1 つのアトミック ビジネス トランザクションとして成功または失敗する一連のアクションです。より正式な説明については、Martin Fowler の定義を参照してください。これは、ドメイン駆動設計のコンテキストでより一般的になった概念です。作業単位は、このようなトランザクションで適用された変更を追跡し、適切なタイミングでこれらの変更を 1 つの ACID トランザクションでコミットします。たとえば、NHibernate では、セッションは作業単位の概念、より具体的には変更追跡をサポートしますが、Linq2SQL ではコンテキスト ...

于 2009-09-26T16:37:00.850 に答える