したがって、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 をそれを必要とするレイヤーに渡すだけです。
これに関するヘルプは大歓迎です、ありがとう!