コントローラーの設計方法について議論している状況があります。
次のコントローラーを検討してください。
public class FileSharingController : Controller
{
private readonly ICommandBus commandBus;
public FileSharingController(ICommandBus commandBus)
{
this.commandBus = commandBus;
}
[HttpPost]
public ActionResult PrepareMetadata(int blocksCount, string fileName, long fileSize)
{
...
}
[HttpPost]
public ActionResult ClearFileMetadata(string fileName){
...
}
[HttpPost] [ValidateInput(false)] //$.ajax({ data: html5FormDataFileChunk , processData: false ... })
public ActionResult UploadBlock(string fileName, int blockId){
var fileUploadCommand = (FileUploadCommand)ExtractFromSessionData(fileName);
var result = commandBus.Submit(fileUploadCommand);
...
}
public ActionResult CommitFileUploads(string[] filesToCommit){
var commitFileUploadCommand = (CommitFileUploadCommand)ExtractFromSessionData(fileName);
var result = commandBus.Submit(commitFileUploadCommand );
...
}
このコントローラーでは、コマンド パターンを使用して、モデルを自分のドメインとインターフェイスする commandBus に渡します。コントローラーの最初の 3 つの[HttpPost]
メソッドは、レスポンシブ ファイル アップロード UI からの jQuery ajax 呼び出しを処理するためのものです。
ユーザーがフォーム (インタビュー) に記入し、いくつかのファイルをアップロードする状況を考えてみましょう。ユーザーはフォームを送信する前にファイルをアップロードできますが、フォームを送信して検証に合格するまで、アップロードされたファイルをコミットしたくありません。そのため、コントローラーの最後のメソッドは http エンドポイントではありません。そのため、次のコントローラーがあります。
public class InterviewController : Controller
{
[HttpGet]
public ActionResult UserInterview()
{
InterviewViewModel viewModel = new InterviewViewModel ();
return PartialView(viewModel);
}
[HttpPost] [AllowAnonymous]
public ActionResult UserInterview(InterviewViewModel viewModel)
{
if(ModelState.IsValid)
{
var fileSharingController = new FileSharingController();
fileSharingController.CommitFileUploads(viewModel.Files);
}
return PartialView(viewModel);
}
}
問題は、IoC を使用commandBus
して FileSharingController に a を挿入しているため、私が行っているようにデフォルトのコンストラクターでインスタンス化することはできません。
考慮すべき私のオプション:
- カスタム コントローラー ファクトリを作成して、コード内の任意の場所でコントローラーをインスタンス化できるようにします。
- FileSharingController を WebAPI コントローラーで有効にして、サービスとして扱います
この状況に適した設計パスはどれですか? 後者の場合、どうすればCommitFileUploads()
メソッドをプライベートに保つことができますか? 最初にフォームの残りを検証せずにトリガーできるエンドポイントとして公開したくありません。