3

したがって、MVC (または Web API) でリポジトリ パターンを使用するすべての DI 例の 99% は、コントローラー アクションで以下のようなものを示しています (コンストラクター インジェクション コードを省略しています_repository)。問題は、(ルールのように) 最初に処理する必要があるものは何もなく、永続化がすぐに開始されるという前提があることです。

public ActionResult Create(Person person)
{
    if (ModelState.IsValid)
    {
      _repository.Add(person);
    }

    return View(person);
}

問題は、オブジェクトを永続化する前にドメイン層でルールを処理する必要がある場合はどうするかということです。person明らかに、私はコントローラーでそのロジックを実行しませんが、ドメイン層でそれを必要とします。以下のどのオプションが良いですか:

オプション 1:リポジトリのすべての永続化の詳細をドメイン/ビジネス レイヤーで呼び出されるように委譲し、コントローラーから引き出します。更新されたコードは次のようになります。

if (ModelState.IsValid)
{
  using (busniessLogic = new MyApp.BusniessLogic(_repository))
  {
       busniessLogic.ProcessRulesAndSavePerson(person);
  }
}

ドメイン層には、次のようなメソッドがある場合があります。

public void ProcessRulesAndSavePerson(Person person)
{
   //process some rules...

   if(rules = true)
   {
     //use injected repository to add now that rules have passed
     _repository.Add(person)
   }
}

オプション 2: Controller で現在と同じままにしますが、リポジトリに保存する前にルールを処理するための呼び出しを行うだけです。更新されたコードは次のようになります。

if (ModelState.IsValid)
{
  using (busniessLogic = new MyApp.BusniessLogic())
  {           
       busniessLogic.ProcessRulesAboutPerson(person);
       _repository.Add(person)
  }
}

私は他のアイデアにもオープンですが、オプション 1 に傾いています。コントローラーを薄く保ち、注入された _repository をそれを必要とするレイヤーに渡すだけです。

これに関するヘルプは大歓迎です、ありがとう!

4

2 に答える 2

4

どちらのオプションもビジネス ロジック プロセッサへの依存関係を作成します。newキーワードを使用するときは常に注意する必要があります。これは、メソッドを単体テストしようとすると、ほとんどの場合、問題が発生し、依存性注入の目的が無効になるためです。

複雑なビジネス ロジックを処理するサービスを作成し、それをコントローラーに挿入する方が適切です。ロジックのほとんどが複雑な場合は、レポジトリをコントローラーに渡すことをスキップして、すべてを処理するサービスに依存します。

コントローラ:

public MyController(IPersonService personService) 
{
    _personService = personService;
}

public ActionResult Create(Person person)
{
    if (ModelState.IsValid)
       _personService.Create(person);
    else
       ......
}

個人サービス:

public PersonService(IPersonRepository repo) 
{
    _repo = repo;
}

public int Create(Person person)
{
    //businesslogic
    return _repo.Add(person);
}
于 2013-01-14T19:26:49.677 に答える
3

必ずしも最善の方法ではありませんが、これは私が通常行う方法です。

  • IService(あなたの場合はビジネスロジック)がコントローラーに注入されます(IRepositoryではありません)
  • ModelState が有効な場合 => コントローラーは、モデルをパラメーターとして受け取る IService のメソッドを呼び出します。
  • IRepository は、必要に応じて Service インスタンスに注入されます。

これにより、次のことが可能になります。 - IService モックアップを提供するコントローラーを単体テストできます。- コントローラがリポジトリとデータ アクセス レイヤを認識しないようにします。

于 2013-01-14T19:17:48.127 に答える