Your SlideShare is downloading. ×
Fun with ASP.NET MVC 3, MEF and NuGet
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Fun with ASP.NET MVC 3, MEF and NuGet

8,189
views

Published on

So you have a team of developers… And a nice architecture to build on… How about making that architecture easy for everyone and getting developers up to speed quickly? Learn all about integrating the …

So you have a team of developers… And a nice architecture to build on… How about making that architecture easy for everyone and getting developers up to speed quickly? Learn all about integrating the managed extensibility framework (MEF) and ASP.NET MVC with some NuGet sauce for creating loosely coupled, easy to use architectures that anyone can grasp.

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
8,189
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
48
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Demo01_MVC_DependencyResolverAdd a property to the HomeController for specifying the welcome messageAdd a class “SimpleDependencyResolver.cs”Implement IdependencyResolver (use snippets for some parts)    public class SimpleDependencyResolver        : IDependencyResolver    {        public object GetService(Type serviceType)        {            if (serviceType == typeof(Controllers.HomeController))            {                var controller = Activator.CreateInstance(serviceType) as Controllers.HomeController;                controller.MessageText = "Welcome, this text has been injected!";                return controller;            }            if (serviceType.IsInterface)            {                if (serviceType == typeof(IControllerFactory)) return new DefaultControllerFactory();                if (serviceType == typeof(IControllerActivator)) return null;                if (serviceType == typeof(IFilterProvider)) return GlobalFilters.Filters;                if (serviceType == typeof(IViewEngine)) return new RazorViewEngine();                if (serviceType == typeof(IViewPageActivator)) return null;            }            return Activator.CreateInstance(serviceType);        }        public IEnumerable<object> GetServices(Type serviceType)        {            return new object[] { GetService(serviceType) };        }    } Register dependencyresolver in App_Start:DependencyResolver.SetResolver(new SimpleDependencyResolver());
  • Demo02_MefContribCreate a new MVC application (application template)Add an IHelloWorldService    public interface IHelloWorldService    {        string Hello();    } Add a HelloWorldService    [Export(typeof(IHelloWorldService))]    public class HelloWorldService        : IHelloWorldService    {        public string Hello()        {            return "Hello from HelloWorldService!";        }    } Change HomeController     public class HomeController : Controller    {        private IHelloWorldService service;         [ImportingConstructor]        public HomeController(IHelloWorldService helloWorldService)        {            this.service = helloWorldService;        }         public ActionResult Index()        {            ViewBag.Message = this.service.Hello();             return View();        }         public ActionResult About()        {            return View();        }    } Run and fail…NuGet the MefContrib.MVC packageExplain the fact that it uses the /bin folder for part discoveryExplain the use of conventions
  • Initech.Components.Theming.DefaultThemeOpen solutionShow it’s nothing but a “plain old” MVC applicationRun the projectDemonstrate it does nothing, it’s just a template…Show the NuGet folder in Windows ExplorerOpen package.nuspec using NuGet Package ExplorerShow people around:Show the “Content” folder, this is where package contents will go. In this case, it will contain the Views, CSS and scripts.Show “lib”: it will contain assemblies (if appropriate for the package)Package.proj is the MSBUILD script that does the packagingOpen itSpecify some settings about what to copy and packageUpdate version number in nuspec fileRun nuget.exe on the nuspec fileAwesomeness!
  • IniTech.TpsCoverSheetGeneratorCreate an empty MVC applicationAdd a library package reference to InitechThemeDefaultThemeUpdate _ViewStart.cshtml to use _InitechLayout.cshtmlAdd a HomeControllerAdd a viewRun the application to show off the templateRemove the view: we’ll generate that later onAdd library package reference (from command line?) to InitechDomainTpsReportsModify Index() action method:        public ActionResult Index()        {            return View(new TpsReportCoverSheet());        } Add POST action        [HttpPost]        public ActionResult Index(TpsReportCoverSheet model)        {            if (ModelState.IsValid)            {                return View("TpsReportCoverSheet", model);            }             return View(model);        } Add [Authorize] attributeAdd library package reference to InitechWebMvcAuthenticationDemonstrate it adds dependencies from NuGet as well as from Initech package repositoryWe need an implementation for the contracts… InitechAuthenticationMembershipDummy & InitechAuthenticationFormsShow the app: almost no code, we just combined some building blocks… 
  • Transcript

    • 1.
    • 2. OPN07
      Fun with ASP.NET MVC 3, MEF and NuGet
      Maarten Balliauw
      Technical Consultant
      RealDolmen
      @maartenballiauw
    • 3. Notes (hidden)
      So you have a team of developers… And a nice architecture to build on… How about making that architecture easy for everyone and getting developers up to speed quickly? Learn all about integrating the managed extensibility framework (MEF) and ASP.NET MVC with some NuGet sauce for creating loosely coupled, easy to use architectures that anyone can grasp.
      So what’s this talk about?
      Show you how you can build an app like Lego
      Show you how you can create Lego blocks for your team
      This is NOT a “general recommended approach”, just an idea that proved to work at one of our customers.
    • 4. Who am I?
      Maarten Balliauw
      Antwerp, Belgium
      www.realdolmen.com
      Focus on web
      ASP.NET, ASP.NET MVC, PHP, Azure, …
      MVP ASP.NET
      http://blog.maartenballiauw.be
      @maartenballiauw
      Me, looking intelligent with glasses
    • 5. Agenda
      Technologies & techniques used
      ASP.NET MVC 3
      Managed Extensibility Framework (MEF)
      NuGet
      Creating application components
      Building an application
      Conclusion
      Further information
      Q&A
    • 6. ASP.NET MVC 3
      All the new stuff:
      Razor view engine
      Global Action Filters
      Unobtrusive Ajax & Client Validation
      Better Visual Studio tooling
      And a very interesting one for doing Lego development:
      Better support for Dependency Injection
    • 7. var partA =new PartA(new PartB())
      Sidenote: Dependency Injection?
      I need a “Part B” !
      Coming up!
      Part A
      Me, doing actual software development
    • 8. Container
      Sidenote: Dependency Injection?
      I need a “Part B” !
      Let me see...
      There you go!
      Part A
      Part B
    • 9. How does this fit into ASP.NET MVC 3?
      ASP.NET MVC 3 uses DependencyResolver
      : IDependencyResolver
      GetService()
      GetServices()
      Register it on application start
    • 10. How does this fit in ASP.NET MVC 3?
      ASP.NET MVC will / can query the IDependencyResolver for
      Controllers
      View engines & view pages
      Filters
      Model validators
      Model metadata
      Check Brad Wilson’s blog for examples on all of these
      http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.html
      Value providers
      Model binders
      Controller activator
      View page activator
    • 11. Dependency Injection in ASP.NET MVC 3
      demo
    • 12. Managed Extensibility Framework (MEF)
      Cool as ICE: Import, Compose, Export
      [Import]Ilogger logger;
      MEF catalog
      HomeController
      [Export(typeof(Ilogger)]
      Let me see...
      There you go!
      ConsoleLogger
      MEF container
    • 13. Options for MEF in ASP.NET MVC 3
      Build an IDependencyResolver
      based on MEF container
      Use MefContrib
      has a built-in IDependencyResolver
      has a “Convention” model
      is available on NuGet
      mefcontrib.codeplex.com
    • 14. A brief NuGet introduction...
      Package management system for .NET
      Simplifies incorporating 3rd party libraries
      Developer focused
      Free, open source
      Use packages from the official feed
      Publish your own packages
      Create & use your own feed
    • 15. Using MefContrib
      And finding it. On NuGet.
      demo
    • 16. MefContrib.MVC3
      Optional addition for MefContrib
      Adds some things to your application:
      AppStart code that does the wiring
      A CompositionDependencyResolver
      Will check all assemblies in /bin
      Will export everything : IController by convention
    • 17. Conventions in MefContrib-MVC3
      public class MvcApplicationRegistry : PartRegistry { public MvcApplicationRegistry() {
      Scan(x => {
      x.Assembly(Assembly.GetExecutingAssembly());x.Directory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"));
      });
      Part()
      .ForTypesAssignableFrom<IController>()
      .MakeNonShared()
      .ExportTypeAs<IController>()
      .ExportType()
      .Imports( // ... ); }
      }
    • 18. This all makes me think...
      Package company components using NuGet?
      Distribute them in a custom feed?
      Use ASP.NET MVC 3?
      Wire everything with MEF & MefContrib?
      Pure application Lego!
      Me, actually thinking
    • 19. Creating application components
      Initech Default Theme
      demo
    • 20. What’s next?
      Building it
      MSBuild (or whatever! Nuget.exe is all that matters)
      Hosting it
      Create a NuGet server
      Or drop everything in a folder
      Using it
      Reference the feed
      Download & install components needed
      Assemble using MEF (or another IoC)
      Install-Package NuGet.Server
    • 21. Let’s see if we can build this...
      Wiredwith MEF
      Packagedas .nupkg
    • 22. Building an application
      TPS ReportsCover Sheet Generator
      demo
    • 23. Conclusion
      You can build an app like a Lego set
      Requires “bricks” (NuGet packages)
      Requires “glue” (MEF / MefContrib / other IoC)
      Requires you to think in terms of components
      Structure is key!
      Not a best-practice architecture
      Just something we toyed with on a project
      Proved to work (for the customer)
    • 24. Further information
      For time travelers:
      FRM06 – Deconstructing Orchard – Bradley Millington – Lagoon L (Tuesday)
      FRM13 – Scaffolding – Steve Sanderson – Breakers H (Wednesday)
      Upcoming:
      FRM09 – NuGetIn Depth – Scott Hanselman & Phil Haack –Lagoon H (now)
      On the Internet:
      www.nuget.org
      mefcontrib.codeplex.com
    • 25. Thank you for joining & filling out the evals!
      Q&A
      http://blog.maartenballiauw.be
      @maartenballiauw
      Me, having a question
    • 26. OPN07
      Fun with ASP.NET MVC 3, MEF and NuGet
      Maarten Balliauw
      Technical Consultant
      RealDolmen
      @maartenballiauw
    • 27. © 2011 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.