Russの優れた回答をもう少し詳しく説明するには、次のことを考慮してください。
public class CheckoutController
{
private readonly ICommandHandler<CheckoutCommand> _checkoutHandler;
public CheckoutController(ICommandHandler<CheckoutCommand> checkoutHandler)
{
_checkoutHandler = checkoutHandler;
}
[HttpPost]
public virtual ActionResult Post(CheckoutViewModel viewModel)
{
if (!ModelState.IsValid) return View(viewModel);
var command = Mapper.Map<CheckoutCommand>(viewModel);
_checkoutHandler.Handle(command);
return RedirectToAction("Complete");
}
public virtual ActionResult Complete()
{
return View();
}
}
コントローラーはビジネス的なことは何もしていません。ユーザーに制御フローを提供します。ここで、この依存関係がコントローラーに注入されているとします。
public class DomainCheckoutCommandHandler : ICommandHandler<CheckoutCommand>
{
private readonly IEntityDataStorage _repos;
private readonly IEmailSender _email;
private readonly ILogger _log;
public DomainCheckoutCommandHandler(IEntityDataStorage repos,
IEmailSender email, ILogger log)
{
_repos = repos;
_email = email;
_log = log;
}
public void Handle(CheckoutCommand command)
{
// use _repos to Add an entry to a database table
// use _email to issue the receipt
// use _log to log the purchase
}
}
これらの 3 つの 投稿には、このようなインターフェイス + DI の使用に関する優れた情報がいくつかあります。
最良の部分は、他のすべてのコード (インターフェイス、ドメイン クラス、およびその他のインターフェイス実装) を MVC プロジェクトの外に完全に移動できることです。そうすれば、MVC プロジェクトではビジネス的なことは何も行われません。ビジネス層または他のクラス ライブラリによって実装されているインターフェイスに委任するだけです。