1

タイプクラスの HomeController と Reference があります。クラスの新しいオブジェクトを作成すると、うまく機能します。しかし、コントローラーで新しいオブジェクトを作成したくありません。代わりに、HomwController のコンストラクターを介してクラスの参照を渡したいのです。コードは次のとおりです。ここでDIを実装する必要があります。

//private readonly UnitOfWork<Student> _unitOfWork = new UnitOfWork<Student>();
    private readonly UnitOfWork<Student> _unitOfWork;

    //TODO ??
    public HomeController(UnitOfWork<Student> unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public ActionResult Index()
    {


        return View(_unitOfWork.GenericRepository.GetAll());
    }

何か助けはありますか?

4

2 に答える 2

2

まず、依存性注入を使用する場合は、サード パーティの依存性注入コンテナー (NInject や Unity など) を使用する必要があります (または、課題を探している場合は独自のビルドを作成します)。

次に、HomeController は、抽象作業単位 (インターフェイスまたは抽象クラス) をパラメーターとして受け取る必要があります。HomeController コンストラクターで実際に具象型を使用していますが、これは依存性注入の世界で機能する方法ではありません (「コンストラクター注入」を使用する場合、依存性コンテナーは、コンテナー構成に基づいて、抽象化の具象実装を提供する役割を果たします。 )。

3番目のあなたUnitOfWork<Student>はあまり意味がありません。ARepository<Student>はある程度意味がありますが、作業単位は単一の「タイプ」ではなく、さまざまなデータセットの「コレクション」で作業しています(作業単位はリポジトリのコレクションで作業している可能性があります)。ここで意味があるのはIUnitOfWork unitOfWork、HomeController コンストラクターでパラメーターを指定し、アクション メソッドで do 操作UnitOfWorkを取得できる具体的なオブジェクトを渡すように依存関係コンテナーを構成することですRepository<Student>(場合によっては、UnitOfWork からアクセスされる他のリポジトリーでも可能です)。オブジェクト) に関連付けられたメソッドを呼び出して、すべての変更をコミットしUnitOfWorkます。

UnitOfWork および Repository パターンを扱っている場合 (およびデータが DB によってバックアップされている場合) は、ASP.NET MVC3 での NInject の使用に関するいくつかの検索を行い、EntityFramework を確認する必要があります。

編集

(IUnitOfWork<Student>およびIUnitOfWork<Course>)を扱うあなたのコメントへの反応として。

前に言ったように、あまり意味がありません。

UnitOfWork は、リポジトリの「コンテナ」と大まかに見なすことができ、これらのリポジトリへのアクセスを許可し、これらのリポジトリでのアクション (すべての変更をコミットするなど) を調整します。またはIUnitOfWorkなどの汎用リポジトリへのアクセスを提供し、DB (またはファイル、メモリ、または作業単位/リポジトリの実装がデータを永続化することを目的としているもの) にコミットする Commit メソッドを含む、抽象的な非汎用型を使用する必要があります。IRepository<Student>IRepository<Course>

このように、コントローラー コンストラクターにIRepository<Student>and/orIRepository<Course>を挿入する代わりに (または、コントローラーが 10 個の異なるリポジトリで動作する必要がある場合は、10 個のパラメーターを渡します:S)、抽象型 IUnitOfWork の単一のパラメーターを受け入れるだけです (具象インスタンスはDI コンテナーによって注入された)、その後、任意のアクション メソッドは、UnitOfWork からそれらを取得することにより、任意のリポジトリ セットで動作できます。すべての変更が完了すると、unitOfWork で Commit を呼び出すことができます。リポジトリで行われた変更。

それが理論であり、一般的な考え方です。

ASP.NET MVC の DI についてより具体的に説明すると、DI コンテナーを "配管" するより一般的な方法 (他の方法もあります) は、DI コンテナーを使用して型を解決することから継承するクラスを作成IDependencyResolverし、このクラスのインスタンス。このように、ASP.NET MVC がコントローラーの作成を要求されると (エンド ユーザーの要求)、この依存関係リゾルバーを経由してコントローラーのインスタンスを要求し、この依存関係リゾルバーは DI コンテナーを使用してインスタンスを作成します。必要なすべての注入を処理することにより、コントローラーの。特定の DI コンテナーの Web サイト / フォーラムを参照してください。ASP.NET MVC を使用してそれを配管する方法がすべて示されています。Application_StartDependencyResolver.SetResolver

これは非常に大まかな概要にすぎません。多くのトリッキーな詳細がありますが、それは大雑把な考えです。

EDIT2

ASP.NET MVC プロジェクトで Repository パターンと UnitOfWork パターンを正しく使用する方法を説明する記事 (私の最初の記事) をブログに投稿しました。

http://codefizzle.wordpress.com/2012/07/26/correct-use-of-repository-and-unit-of-work-patterns-in-asp-net-mvc/

于 2012-07-25T08:56:12.800 に答える
1

ASP.NET MVC について話しているのですか?

私はしばらく Ninject を使用してきましたが、とても満足しています! このリポジトリのサンプル アプリを見て、ASP.NET MVC 3 での使用方法を理解してください。

https://github.com/ninject/ninject.web.mvc/tree/master/mvc3

返信を少し拡張するために、Ninjectバインディングをセットアップしたコードスニペットを次に示します

kernel.Bind(typeof(IUnitOfWork<>).To(typeof(UnitOfWork<>));

そして私のコントローラー:

public class MyController : Controller {
    private readonly IUnitOfWork<Student> uowStudent;
    public MyController(IUnitOfWork<Student> uowStudent) {
        this.uowStudent = uowStudent;
    }
}

あとは、UnitOfWork クラスのコンストラクターの引数がすべてカーネルでもバインドされていることを確認するだけです。

于 2012-07-25T08:39:02.947 に答える