3

簡単な質問があります。私のasp.net MVCプロジェクトでUnityを使用しようとしています。Unit of Work パターンを EF コンテキストで使用すると、問題が発生します。

コンストラクターに uow を挿入するとしますが、コントローラーに 4 つまたは 5 つのアクションがありUnitOfWork、using ステートメントで使用する必要があります。これはうまくいきません!Id は
new UnitOfWork() 各アクション メソッドで a を実行する必要があるためです。

UnitOfWork各アクションメソッドにa を注入する必要がありますか? またはコンストラクタだけに?または、これをまったく注入する必要があります!! 私が直面している問題は、コントローラーをモック データで単体テストできるようにしたいということUnitOfWorkですDBContext

4

2 に答える 2

3

代わりにファクトリを注入します。このようにして、懸念の分離と疎結合を実現しますが、ステートメントの使用に関する問題に直面することはありません。

private IUnitOfWorkFactory factory;

public MyController(IUnitOfWorkFactory factory)
{
    this.factory = factory;
}

public ActionResult MyAction()
{
    using (var uow = factory.CreateUnitOfWork())
    {
        // ...
    }
}

編集

このようなアプローチの自然な利点は、その構成可能性です。さまざまなコントローラーにサービスを提供する任意のファクトリを登録し、コンポジション ルートに接続できます。

// Note: this isn't unity syntax, but I hope my point is clear
container.Register<ISessionFactory, ReusableSessionFactory>("Reusable");
container.Register<ISessionFactory, FreshSessionFactory>("Fresh");
container.Register<IController, LoginController>().With("Fresh");
container.Register<IController, HomeController>().With("Reusable");

今、

  • LoginController要求ごとに内部で新しいセッションを提供するファクトリを使用します
  • HomeController一方、同じセッションをその存続期間全体にわたって再利用します

コントローラーの観点からは、どのファクトリがセッションを提供するかは単なる実装の詳細であるため、無関係であることに注意してください。そのため、セッション ファクトリの依存関係を抽象化 (この例ではインターフェイス) の背後に隠し、アプリケーションのルートですべてのオブジェクトから依存関係へのバインディングを実行します。

于 2013-01-14T12:58:43.463 に答える
1

私の理解が正しければ、Moq のようなもので UOW をテストしたいだけですか?

その場合、優れた設計原則と関心の適切な分離のために、各リポジトリ クラスが使用するデータベースの基本コンテキストを作成する必要があります。

次に、ドメイン モデル エンティティごとにリポジトリ インターフェイスを作成する必要があります。次に、別のリポジトリ ライブラリにインターフェイスを実装できます (この方法で POCO モデルを実装できます)。

最後に、ドメイン オブジェクトとアクション メソッドの間にサービス層を作成するか、アクション メソッド内で必要なリポジトリ インターフェイスを使用するだけです。

アプリケーション インフラストラクチャに依存するため、このように答えます。サービス レイヤーがない場合のベスト プラクティスは、次の手順を実行することです。

   public class AccountController : Controller
    {
        private readonly IAccountRepository _accountrepository;

        public AccountController(IAccountRepository repository)
        {
            _accountrepository = repository;
        }
}

これが役立つことを願っています。

于 2013-01-14T12:42:36.377 に答える