2012-03-13 12 views
13

MVCのコントローラーのパーシャルクラスを作成できますか?コントローラーの部分クラス

理由:あまり​​にも多くのコードを含むコントローラがあります。このコントローラーにはさまざまなレポートのコードが含まれており、コードが多すぎるためコードの可読性が低下します。すべてのレポートでコントローラの名前を同じにしておきたいので、さまざまなレポートのコードを配布したいと思います。

もし私が他の方法で私に知らせてくれればいいですか?

おかげ Alokシャー

答えて

13

はい、あなたは部分クラスを使用することができます - コンパイラは一つだけを生成するためにコンパイル時にそれらのすべてをマージします。

しかし、あなたはコードを配布したいと言います - コードが複数のプロジェクトに入る場合、部分的なものは助けにならないでしょう。

あなたが代わりに必要なアクションメソッドを持つクラスライブラリプロジェクトにSystem.Web.Mvc.Controllerから継承ベースのコントローラクラスを(作成した後、単に別のコントローラにルーティング似たURLへのルーティングを使用することができます。Here's a link to the Asp.Net Tutorial 'Creating Custom Routes'そのために役に立つかもしれません。

使用する必要のあるWebアプリケーションですが、これは基本的なことですが、すべてをカバーしているわけではありません。これらのオブジェクトは、再配布可能なものから継承するコントローラを持つだけです。さらに、仮想メソッドなどを使用して拡張ポイントを作成できるようになりました。さまざまなWebアプリケーションがカスタマイズする必要があるこれらのレポート。だから、

"Reports/Customers"できOrdersReportsControllerからCustomerReportsController"Reports/Orders"可能性をルーティングするためのルート:

routes.MapRoute("CustReports", 
    "Reports/Customers/{action}", 
    new { controller = "CustomerReports", action = "Index", id = "" }); 

routes.MapRoute("OrderReports", 
    "Reports/Orders/{action}", 
    new { controller = "OrdersReports", action = "Index", id = "" }); 

これは、この問題に対する最も単純なアプローチである - しかし、私はAreasを使用してだと思うが(リンクはMSDNのチュートリアルにある)ほとんどのだろうおそらくは適用される可能性があります。その場合は、デフォルトのルートがそれをすべて実行するため、ルーティングをまったく使用する必要はありません。

+0

+1、素敵なアイデア! –

+0

@Andras:サンプルコードやリファレンスリンクはありますか?私は決してカスタムルーティングをしなかったので、それについては何も考えていません。 –

+0

@alok_didaが更新されました。 –

6

もちろん!

パーシャルクラスは、C#言語の機能であり、MVCやその他の使用しているフレームワークとは無関係です。

+0

..それは私もコントローラの部分クラスを作成できることを意味します。右? –

+2

これは正しいです:) –

0

はい。部分クラスは実際には言語の機能に過ぎず、コンパイルされたクラスは他のクラスと同様に通常の.NETクラスです。

あなたは懸念の適切な分離を確保するために、複数のコントローラにコントローラを分割しているのに、私はお勧めし

(複数のファイルにそれを分割する必要があるので、大きいクラスを持つきっとsmell bad。)

0

」私は他の方法で行うことができる場合よりは、私に知らせてください」

方法について:

  • 抽象離れて 『』やっインタフェースに準拠すべてが個別のレポートタイプのためのさまざまなレポートジェネレータ、重量部。これらのレポートジェネレータは、アプリケーションのMVC層の外部にあるクラスになります。
  • クリーンアップコントローラ依存性(レポートジェネレータ)は、コントローラのうち及び報告の具体的な実装にアップレポート生成コードの全てをNinject、のStructureMapまたは城ウィンザー
  • クリーンを使用して、コンストラクタに注入されるようにジェネレータの抽象化

コントローラを別々のクラスに分割する必要はありません。欠点は、これが概念化して実装するのに妥当な時間がかかることですが、より良いコードベースで終わることになります。

+0

私はあなたに追いつくことができません。サンプルコードまたはサンプルアプリケーションを私に提供してもらえますか? –

+0

ここでの難しさは概念化されています - 私は実際にあなたにサンプルアプリケーションを与えることはできませんが、私はあなたに(より良い言葉で)記述したことのまともな説明と例を指摘することができます - http: /www.mikesdotnetting.com/Article/117/Dependency-Injection-and-Inversion-of-Control-with-ASP.NET-MVC – SpaceBison

関連する問題