3

私は本当に混乱しています.本「Apress pro Asp.net Mvc 4」で、Mvc 4の最良のパターンは依存性注入であることを学びました(データベースのモデルデータなどを別のプロジェクトに配置するため) (ドメイン) を作成し、それらのインターフェイスへのインターフェイスと実装を作成し、Ninja でコントローラーに接続します。

そして、db へのすべての接続は、viewModel の Web ソリューションの唯一のモデルであるデータ層ソリューションからのみ行われます。

コントローラー

public class ProductController : Controller
{

    private IProductRepository repository;

    public ProductController(IProductRepository productRepository)
    {
        this.repository = productRepository;
    }
    ....
}

とNinject

 ninjectKernel.Bind<IProductRepository>().To<EFProductRepository>();

一方、私の最後の仕事(ウェブマスター)では、会社は mvc プロジェクトに別のパターンを使用していました(私は現在このパターンを使用しています)。

プロジェクトは 1 つのソリューションのみで作成され、静的クラスを使用してデータ層を処理します

依存性注入は好きではありません。これは複雑すぎます。「f12」までに、Concrete クラスの代わりにインターフェースのみが表示されます。

いくつかの質問:

  1. どのパターンがパフォーマンスに優れていますか (高速な Web サイト)?
  2. 「public Db db = new Db();」を使うのは良くない ドメイン層でのみ使用するのではなく、コントローラーで使用します(ソリューション)??
  3. 依存性注入を使用する利点は何ですか? 私のパターンを使うのは悪くないですか?
  4. プロジェクトをデータレイヤーの 2 つのソリューションに分割する利点は何ですか?

例:

 public class LanguageController : AdminController
    {
         public Db db = new Db();

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        //
        // GET: /Admin/Language/
        public ActionResult Index()
        {
            return View(db.Languages.ToList());
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(short id)
        {
            Language language = db.Languages.Find(id);
            db.Languages.Remove(language);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    ...
}
4

1 に答える 1

6

どのパターンがパフォーマンスに優れていますか (高速な Web サイト)?

答えられない。これらのアプローチのいずれかで、パフォーマンスの低いコードが作成される可能性があります。時期尚早にパフォーマンスを最適化しようとしないでください。クリーンでサポート可能なコードを最適化し、実際のシナリオで実際に観察されるパフォーマンスのボトルネックに対処してください。

「public Db db = new Db();」を使うのは良くない ドメインレイヤーでのみ使用するのではなく、コントローラーで使用します(ソリューション)

それは、懸念を分離し、依存関係を分離することの問題です。コントローラーがデータベースへの接続を内部的にインスタンス化する場合、そのコントローラーはそのデータベースのコンテキストでのみ使用できます。これにより、コントローラーの単体テストが非常に困難になります。また、データベースを置き換えることはコントローラーを変更することを意味することも意味しますが、その場合はコントローラーを変更する必要はありません。

依存性注入フレームワークは、単に依存性逆転の原則に対処する方法です。オブジェクト A (コントローラー) がオブジェクト B (データベース オブジェクト) のインスタンスを必要とする場合、内部でインスタンス化するのではなく、インスタンスを提供する必要があるという考え方です。ここですぐに得られる利点は、オブジェクト B が、多くの異なる実装を持つインターフェイスまたは抽象クラスにすぎないことです。オブジェクト A は、同じ観測可能な動作を満たす限り、どの実装が与えられたかを気にする必要はありません。

依存関係を反転することにより (依存関係注入フレームワークを使用するかどうかに関係なく)、コントローラーからデータベースへの依存関係を削除します。コントローラーは、クライアントが開始した要求を処理するだけです。他の何かがデータベースの依存関係を処理します。これにより、これら 2 つの別個のオブジェクトの移植性と再利用性が向上します。

依存性注入を使用する利点は何ですか? 私のパターンを使うのは悪くないですか?

上記を参照。依存関係の注入は、依存関係の逆転を実現する方法であり、この場合の中心的な目標です。これを実現するには、いくつかの異なる方法があることに注意してください。コンストラクター注入を好むフレームワークもあれば、プロパティ/セッター注入などをサポートするフレームワークもあります。個人的には、サービス ロケーター パターンを使用する傾向があります。これには、依存関係インジェクター自体の依存関係を抽象化できるという追加の利点があります。

使用中に問題が発生した場合、そのアプローチを使用するのは「悪い」だけです。さまざまな問題に対処するための適切なパターンがありますが、プロジェクトにそれらの問題が正当に存在しない場合、それらのパターンを使用するとオーバーエンジニアリングになり、実際にはコードのサポート可能性が損なわれます。だから、何でもそうですが、「場合による」のです。

プロジェクトをデータレイヤーの 2 つのソリューションに分割する利点は何ですか?

2つのソリューション?または、同じソリューション内の 2 つのプロジェクトですか? (結果として 2 つのアセンブリが作成されます。) 利点は、一方を他方に依存せずに再利用できることです。たとえば、投稿したコードの一部には、リポジトリ パターンへの暗示があります。バックエンド データにリポジトリを実装する目的のみを果たすアセンブリがある場合、どのアプリケーションでもそれらのリポジトリを使用できます。代わりに、すべてが MVC アプリケーションに直接実装されている場合、他のアプリケーションはそれを使用できず、MVC アプリケーションに緊密に結合されます。

その機能を再利用する必要がまったくないのであれば、これで終わりではありません。その機能を再利用したい場合は、依存関係を内部的に分離する移植可能なアセンブリに分離することで、それが可能になります。

于 2013-07-18T15:32:47.473 に答える