1

私のコントローラーには、ビューの選択を担当するロジックの一部を共有する2つのアクションがあります。この部分をアクション全体で共通にするにはどうすればよいですか。例:

コントローラドキュメント

  • アクションオープン

    1. 見つかったドキュメントが1つあり、タイプXの場合は、OpenXViewを使用して表示します。
    2. 見つかったドキュメントが1つあり、タイプYの場合は、OpenYViewを使用して表示します。
    3. 見つかったドキュメントが複数ある場合は、リストビューを使用してリストを表示します
    4. ドキュメントが見つからない場合は、エラービューを使用してエラーを表示します
  • アクションOpenMetaData

    1. ドキュメントが1つ見つかった場合は、OpenMetaDataViewを使用して表示します
    2. 見つかったドキュメントが複数ある場合は、リストビューを使用してリストを表示します
    3. ドキュメントが見つからない場合は、エラービューを使用してエラーを表示します

ご覧のとおり、ポイント3,4は2,3と同じです。

のようなものを作りたい

public DocumentController
{

    public ActionResult Open( ... )
    {
       var dataFromWebService = service.GetData( ... );
       return ViewSelector.GetLaunchView(dataFromWebService);
    }

    public ActionResult Open( ... )
    {
       var dataFromWebService = service.GetData( ... );
       return ViewSelector.GetOpenMetaData(dataFromWebService);
    }
}

public class ViewSelector
{
     public static ActionResult GetLaunchView(DataFromWebService dataFromWebService)
     {
          if( dataFromWebService contains document type X)
              return new ViewResult("OpenX",data);
          if( dataFromWebService contains document type Y)
              return new ViewResult("OpenY",data);
          return CommonLogic(dataFromWebService);
     }

     public static ActionResult GetOpenMetaData(DataFromWebService dataFromWebService)
     {
          ......
     }

     private static ActionResult CommonLogic(DataFromWebService dataFromWebService)
     {
          .... Common logic
     }
}

これを実行して、コントローラーをできるだけクリーンにします。

コントローラの外部でViewResultsを作成し、それらにデータを添付してアクションで返すことはできますか?

これは良いデザインですか、それとも悪いデザインですか?

多分誰かがこれを処理する方法についてより良い考えを持っています

4

1 に答える 1

0

コントローラのコンテキストにアクセスする必要がない場合は、コントローラの外部で結果を作成できます。あなたの場合、GetOpenMetaData()メソッドとGetLaunchViewメソッドをコントローラーのプライベートメソッドにすることを検討します。

複数のコントローラー間で共有する必要がある場合は、抽象BaseControllerに入れて、コントローラーに継承させることも検討できます。

于 2012-07-04T18:36:11.857 に答える