2012-03-13 17 views
13

Czy jest możliwe utworzenie klasy częściowej dla kontrolera w MVC?Częściowa klasa dla kontrolera

Powód: Mam kontroler zawierający zbyt wiele kodów. Ten kontroler zawiera kod dla różnych raportów, a ze względu na zbyt wiele kodu zmniejsza czytelność kodu. Chcę, aby nazwa kontrolera była taka sama dla wszystkich raportów, dlatego chcę rozpowszechniać kod dla różnych raportów.

Jeśli mogę zrobić w inny sposób, niż daj mi znać.

Dzięki Alok Shah

Odpowiedz

13

Tak można użyć częściowej klasy - kompilator po prostu łączy je wszystkie do czasu kompilacji do wyprodukowania jednego.

Podaje się jednak, że chcesz "rozpowszechniać" kod - jeśli kod ma przejść do wielu projektów, częściowe działania nie pomogą.

Można zamiast tworzenia klas kontrolera stacji bazowej (które dziedziczą z System.Web.Mvc.Controller w projekcie biblioteki klasy, z niezbędnymi metod działania, a potem po prostu korzystać z trasy do trasy podobnych adresów URL do różnych kontrolerów. Here's a link to the Asp.Net Tutorial 'Creating Custom Routes' które mogłyby być przydatne do tego. Gorąco polecam przejrzenie pozostałej części samouczka, jeśli istnieją inne kluczowe aspekty MVC, których nie masz pewności, nie obejmuje wszystkiego, ale ma podstawy.

Aplikacja internetowa, która musi być używana wtedy po prostu mają swoich kontrolerów, którzy dziedziczą po tych redystrybucyjnych, a jeszcze lepiej, możesz teraz tworzyć punkty rozszerzalności za pomocą metod wirtualnych itp., jeśli są elementy te raporty, które różne aplikacje internetowe mogą wymagać dostosowania.

Więc "Reports/Customers" mógł trasa do CustomerReportsController i "Reports/Orders" mógł trasy do OrdersReportsController:

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

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

Jest to najbardziej uproszczone podejście do tego problemu - ale myślę, że za pomocą Areas (link jest na MSDN solucji) byłyby najbardziej prawdopodobnie również będzie to miało zastosowanie, w takim przypadku możesz nie potrzebować wcale routingu, ponieważ domyślna trasa prawdopodobnie to wszystko.

+0

+1, niezły pomysł !! –

+0

@Andras: Czy mogę podać przykładowy kod lub odnośnik do niego? Nigdy nie robiłem niestandardowego routingu, więc nie mam o tym pojęcia. –

+0

@alok_dida zostały zaktualizowane. –

6

Oczywiście!

Częściowe klasy są cechą języka C# i nie mają związku z MVC ani żadną inną strukturą, z której możesz korzystać.

+0

.. Oznacza to, że mogę tworzyć klasy cząstkowe również dla kontrolera. Dobrze? –

+2

To prawda :) –

0

Tak. Częściowe klasy są po prostu cechą języka, a skompilowana klasa jest zwykłą klasą .NET, jak każda inna.

Sugerowałbym jednak, że dzielisz kontroler do wielu kontrolerów, w celu zapewnienia właściwej separacji obawy (o klasę, która jest tak duża, trzeba podzielić go na kilka plików z pewnością smell bad.)

0

" Jeśli mogę zrobić w inny sposób niż daj mi znać”

Jak o:

  • Streszczenie dala«robi»części do różnych generatorów raport dla pojedynczych typów raportów, z których wszystkie są zgodne z interfejsem . Te generatory raportów będą klasami znajdującymi się poza warstwą MVC aplikacji.
  • Oczyść kontroler, aby zależności (generatory raportów) zostały wstawione do konstruktora, używając programu Ninject, StructureMap lub Castle Windsor
  • Oczyść cały kod generowania raportów ze sterownika i na konkretne implementacje raportu abstrakcje generatora

Nie trzeba wtedy dzielić kontrolerów na oddzielne klasy. Minusem jest to, że zajmie to rozsądną ilość czasu na konceptualizację i implementację, ale skończy się lepszym kodem źródłowym.

+0

Nie jestem w stanie dogonić ciebie. Czy możesz podać mi przykładowy kod lub przykładową aplikację? –

+0

Trudność polega na konceptualizacji - naprawdę nie mogę podać przykładowej aplikacji, ale mogę wskazać ci przyzwoite wyjaśnienie i przykład wielu z tego, co opisałem (również w lepszym języku) - http://www.mikesdotnetting.com/Article/117/Dependency-Injection-and-Inversion-of-Control-with-ASP.NET-MVC – SpaceBison