430 likes | 613 Views
Plug & Play MVC MVC alustan laajennus Lenard Gunda. Esittely. Lenard Gunda lenard.gunda@fi.fujitsu.com Ohjelmisto arkkitehti , Fujitsu Services Oy blogi : http://rebuildall.umbraworks.net twitter: lenardg. Agenda. ASP.NET MVC Pipeline Demon esittely
E N D
Plug & Play MVC MVC alustan laajennus Lenard Gunda
Esittely • Lenard Gunda • lenard.gunda@fi.fujitsu.com • Ohjelmistoarkkitehti, Fujitsu Services Oy • blogi: http://rebuildall.umbraworks.net • twitter: lenardg
Agenda • ASP.NET MVC Pipeline • Demon esittely • KarttaLaajennuspisteisiinjademot
MVC Pipeline ViewEngine HTTP request View ActionResult Routing Action method Route handler Controller HTTP response HTTP handler ControllerFactory
MVC Pipeline Custom ViewEngine ViewEngine HTTP request View HtmlHelper extension methods ModelBinder ActionResult Routing Action method Filters Custom ActionResult Custom RouteBase Custom ActionInvoker Route handler Controller HTTP response Controller base class Custom ControllerFactory HTTP handler ControllerFactory
Reitinosientunnistaminen • Miten reitin osat (routevalues) saadan HTTP pyynnön URL:sta? http://host.domain/application/controller/action/id controller action id Reitintiedot
Reititys • Miksitarvitaanräätälöidytreitit? • Jos controller ja/tai action eivoidapäättääpelkästään URL:n perusteella • Jos jotainomaalogiikkaatarvitaan kun valitaanreitti • Jos reitityskielieivoiilmaistahaluttuareittimuotoa
Reititys #2 Reitinnimi Oletusarvot • Monessa tilanteessa oletusreitit voivat ratkaista ongelmat, niillä pystyy ilmaisemaan paljon erilaisia tilanteita: • Voidaanluodatarvittavanmääränparametreja • Arvojavoidaanrajoittaa • * reitinosa: kaikki loput reitistä menee siihen • Esimerkki blog reiteistä: Reitinmuoto Rajoitukset routes.MapRoute( "SingleEntryWithBlog", "{blogUrl}/{year}/{month}/{day}/{entryUrlID}", new { controller = "Entries”, action = "Display", day = -1, entryUrlID= (string)null }, new { year = @"\d{4}", month = @"\d{2}", day = @"\d{2}|-1", blogUrl= blogFilter });
OmaRouteBase • PeriuusiluokkaRouteBaseperusluokasta • Override: • GetRouteData() - Analysoi URL japäättelereitinosat (RouteData). • GetVirtualPath() - Analysoireitinosatjamikäli on meidänreitinosat, luo URL • MVC pipelinenmuutosatmuuttamatta muista“controller” ja “action”! • Uudenreitinrekisteröinti (Global.asax.cs) • public static void RegisterRoutes(RouteCollectionroutes) { • ... routes.Add(”Nimi”, newOmaRouteBase()); ... }
ControllerFactory Reitintiedot ControllerFactory action controller id Execute() Controller Controller Controller instance Controller
ControllerFactory • MiksitarvitaanräätälöityControllerFactory? • Oletustoteutuksen tapa löytää Controller luokkaeisovi • Dynaamisestiladatutassemblyt • Erilainennimeämiskäytäntö • Halutaanvaikuttaa Controller luokanluomiseen • Parametritconstructorille (IOC) • IActionInvokerasetus
OmaControllerFactory • ToteutetaanIControllerFactory • Parempi tapa periäluokkaDefaultControllerFactoryperusluokastajakuormittaatoiminnallisustarpeenmukaan • Rekisteröinti (global.asax.cs) ControllerBuilder.Current.SetControllerFactory( new OmaControllerFactory());
ActionInvoker Reitintiedot action controller id Controller ActionInvoker Action method Action method Action method Action method
ActionInvoker • MiksitarvitaanräätälöityActionInvoker? • Metodinpäättelyvaatiimuutakuinpelkänreitinosan • Metodinlöytäminenluokastavaatiiomaalogiikkaa
OmaActionInvoker • ToteutetaanIActionInvoker • Helpompi tapa periäluokastaControllerActionInvokerjakuormittaatoiminnallisuudettarpeenmukaan • Jos halutaanvaanvaikuttaametodinnimeen, helpointa on kuormittaaIActionInvokerrajapinnanmetodi • ActionInvokerpitääasettaaControllerissa. • IControllerFactory:nkautta • Controller perusluokassa
Meidän demo: CMS • YksinkertainensisällönhallintajärjestelmäMVC:npäälle • Demossakeskitytään wiki toiminnallisuuteen SQL database Controller Repository LINQ
Path: /wiki/TechEd Controller nimi: Wiki Controller: WikiController, CMS.Wiki, version=1.0.0.0 Esimerkki(sisällötjatyypit) • wiki • TechDays • TechEd • PDC • articles • cooking • Domino icecream • Lasagne Path: /articles/cooking/Domino_icecream Controller nimi: Article Controller: ArticleController, CMS.Common, version=1.0.0.0
Demo: CMS • Reitityksenräätälöinti • Reititperustuvatsisällönpuurakenteeseen • Näytettäväsisältötunnistetaanreitinperusteella • ControllerFactoryräätälöinti • Controller luokkaperustuusiihensisältötyyppiinmitänäytetään • ActionInvokerräätälöinti • Käyttäjästäriippuenmuiden action metodienlaukaiseminen • Show action yksinkertaistanäyttöävarten (HTTP GET) • Update action kun tarvitseetallentaatietoa (HTTP POST) • Delete action kun halutaanpoistaatietoa (HTTP DELETE) • Create action kun halutaanlisätäuuttatietoa (HTTP CREATE)
HtmlHelper • Tarjoaanäkymillepalveluja • VoidaantarjotaomiapalvelujatekemälläHtmlHelper:inpäällelaajennuksia • Käytetäänlaajenusmetodeja (extension methods - C# 3.0)
Model binder A = 1 B = 2 class MyModel { int A; int B; MyC C; string[] J; } class MyC { int D; int E; int F; MyG G; } class MyG { int H; int I; } HTTP pyyntö A = 1 B = 2 C.D = 3 C.E = 4 C.F = 5 C.G.H = 6 C.G.I = 7 J[0] = ”omena” J[1] = ”päärynä” <<MyC C>> D = 3 E = 4 F = 5 Model Binders <<MyG G>> H = 6 I = 7 <<string[] J>> omena päärynä
Model binder • Miksitarvitaanoma model binder? • Oman tietotyypinmuuttaminenpyynnöstä .NET tyypiksi • Esimerkiksisuojattu/koodattu ID
Oma Model binder • Kaksitapaatehdä: • ToteutarajapintaIModelBinder • PeriuusiluokkaluokastaDefaltModelBinder • Kaksitapaakäyttää: • Rekisteröidän .NET tyypilleglobaalinen binder • Lisätään action metodinparametrineteenattribuutti: ModelBinders.Binders.Add(typeof(DataType),newMyDataTypeBinder()); public ActionResultMyAction ( [ModelBinder(typeof(MyDataTypeBinder))] DataTypedt ) { … }
Onko autentikoitu? Ei ole Filter Filters Controller On autentikoitu Ei ole Filter Action method Onko HTTPS? ASP.NET MVC Pipeline On HTTPS Action method
Omatfilterit • FilterAttribute • Luouusiattribuutti(perimälläperusluokastaSystem.Web.Mvc.FilterAttribute) • Toteutajokuseuraavistarajapinnoista: • IAuthorizeFilter • IExceptionFilter • IResultFilter • IActionFilter • Periolemassaolevaattribuuttijaräätälöisentoimintoa • AuthorizeAttribute • …
Controller perusluokka • Miksitarvitaanoma Controller perusluokka? • IActionInvokerasetus • Yleiskäyttöisettoiminnallisuudet (data access) classOmaController : System.Web.Mvc.Controller{ // parametriton constructor!! public OmaController () { ... } }
ActionResult Controller JsonResult FileResult RedirectResult Action method RedirectToAction ViewResultBase (ViewResult) (PartialViewResult) ActionResult ... ExecuteResult() HTTP response
OmaActionResult • MiksitarvitaanomaActionResult? • Halutaangeneroidavastaus • Esimerkiksi: RSS feedi classOmaActionResult : System.Web.Mvc.ActionResult{ public override voidExecuteResult ( ControllerContext context ) { ... } }
ViewEngine ViewEngine ViewEngine ControllerContext view View Reitinosat View View View id action controller View View
OmaViewEngine • HarvointarvitseetäysinomaaViewEnginetehdä. Yleisestitarvitaanvaanolemassaolevienräätälöintiä. class OmaViewEngine : IViewEngine { ... } ViewEngines.Engines.Add ( new OmaViewEngine() );
ViewEngineräätälöinti • KaksioletusViewEnginea: • System.Web.Mvc.WebFormViewEngine • System.Web.Mvc.RazorViewEngine • Yksiperusluokka: • System.Web.Mvc.VirtualPathProviderViewEngine • Näkymien sijainnin muuttaminen • VirtualPathProviderViewEngine sisältää polkupohjat taulukkoja
ViewEngineräätälöinti • Virtuaaliset polut annetaan VirtualPathProviderinstanssille • VirtualPathProviderViewEnginejäsen VirtualPathProvider • TÄTÄ EI VOI KÄYTTÄÄ tiedostojen löytämiseen. Sen sijaan rekisteröidään globaali VirtualPathProvider HostingEnvironment.RegisterVirtualPathProvider ( new MyProvider () );
VirtualPathProvider ASP.NET Web sovellus (WebForms, MVC) /app/Views/Test.aspx .NET Framework <<VirtualFile>> C:\Web\Sovellus\v1_0\ Views\Test.aspx VirtualPathProvider Tiedostojärjestelmä
VirtualPathProvider ASP.NET Web sovellus (WebForms, MVC) /app/Views/Test.aspx .NET Framework <<VirtualFile>> 0x1234567890ABCDEF VirtualPathProvider Oma VirtualPathProvider Tiedostojärjestelmä Tietokanta
VirtualPathProvider • MiksitarvitaanomaVirtualPathProvider: • Tiedostot (View) säilytetään tietokkannassa: • http://bit.ly/hsLqMe • Tiedostot (View) säilytetään ZIP tiedostossa: • http://bit.ly/fndBw8
Yhteenveto • ASP.NET MVC tarjoaapaljonominaisuuksiajamahdollisuuksiamillävoiräätälöidäkehikon • Palikoitavoidaanvaihdellayksikerallaanlisäämälläuusiaominaisuuksiajarakentamallajuurisopivanjärjestelmän • MVC lähdekoodi: http://aspnet.codeplex.com/
Q&A Kiitoksia!
© 2009 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.