$30 off During Our Annual Pro Sale. View Details »

Rebooting the ASP.NET Franchise

Rebooting the ASP.NET Franchise

Are you an ASP.NET developer that is tired of the baggage and cruft within the framework? Do you wish you could use OS X for developing ASP.NET apps? Are you new to ASP.NET, but are adverse to installing Windows and Visual Studio? Everything has changed: ASP.NET isn’t just for Visual Studio, anymore. Learn how ASP.NET has broken free from Windows and has turned into a fresh, cross-platform, OS-agnostic framework. Develop ASP.NET applications on your OS, with your editor, in your way. No more compromises, no VMs, no workarounds. Grab some popcorn an experience the reboot of the ASP.NET Franchise.

Jay Harris

June 11, 2016
Tweet

More Decks by Jay Harris

Other Decks in Technology

Transcript

  1. #aspNetReboot
    R E B O O T I N G T H E
    A S P. N E T F RA N C H I S E
    @ j a y h a r r i s

    View Slide

  2. asp.net core

    View Slide

  3. 1.0.0-*

    View Slide

  4. aspnet/home
    MIT license
    !

    View Slide

  5. breaking change

    View Slide

  6. folder structure

    View Slide

  7. ./MyWebProject/
    ├── wwwroot
    ├ Program.cs
    ├ project.json
    └ Startup.cs

    View Slide

  8. ./MyWebProject/
    ├── wwwroot
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./OldMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ OldMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  9. ./MyWebProject/
    ├── wwwroot
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./OldMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ OldMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  10. ./MyWebProject/
    ├── wwwroot
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./OldMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ OldMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  11. ./MyWebProject/
    ├── wwwroot
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./OldMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ OldMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  12. ./MyWebProject/
    ├── wwwroot
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./OldMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ OldMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  13. ./MyWebProject/
    ├── Controllers
    ├── Views
    ├── wwwroot
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./OldMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ OldMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  14. ./MyWebProject/
    ├── Controllers
    ├── Views
    ├── wwwroot
    │ ├── Content
    │ └── Scripts
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./OldMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ OldMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  15. Serve /wwwroot/**/*.*
    Serve /**/*.* except:
    .ad
    .adprototype
    .asax
    .ascx
    .browser
    .cd
    .compiled
    .config
    .cs
    .csproj
    .dd
    .dgdsm
    .dsprototype
    .exclude
    .java
    .jsl
    .ldb
    .ldd
    .lddprototype
    .ldf
    .licx
    .lsad
    .lsaprototype
    .master
    .mdb
    .mdf
    .msgx
    .refresh
    .resources
    .resx
    .rules
    .sd
    .sdm
    .sdmDocument
    .sitemap
    .skin
    .ssdgm
    .ssmap
    .vb
    .vbproj
    .vjsproj
    .vsdisco
    .webinfo

    View Slide

  16. ./MyWebProject/
    ├── Controllers
    ├── Views
    ├── wwwroot
    │ ├── Content
    │ └── Scripts
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./MyMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ MyMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  17. ./MyWebProject/
    ├── Controllers
    ├── Views
    ├── wwwroot
    │ ├── Content
    │ └── Scripts
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs
    ./MyMvcProject/
    ├── Controllers
    ├── Content
    ├── Scripts
    ├── Views
    ├ MyMvcProject.csproj
    ├ Global.asax
    ├ Global.asax.cs
    ├ packages.config
    └ web.config

    View Slide

  18. code changes

    View Slide

  19. MyWebProject
    ├── Controllers
    ├── Views
    ├── wwwroot
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs

    View Slide

  20. MyWebProject
    ├── Controllers
    ├── Views
    ├── wwwroot
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs

    View Slide

  21. {
    "authors": ["Jay Harris"],
    "dependencies": { },
    "scripts": { },
    "frameworks": {
    "netcoreapp1.0": { }
    }
    }

    View Slide

  22. {
    "version": "1.0.0",
    "authors": ["Jay Harris"],
    "description": "This is my new web project"
    }

    View Slide

  23. {
    "dependencies": {
    "Microsoft.NETCore.App": {
    "type": "platform",
    "version": "1.0.0-*"
    }
    "Microsoft.AspNetCore.Mvc": "1.0.0-*",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-*",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0-*"
    }
    }

    View Slide

  24. {
    "scripts": {
    "postrestore": [ "npm install" ],
    "prepare": [ "grunt bower:install" ]
    }
    }

    View Slide

  25. {
    "scripts": {
    "prerestore": "echo runs before restoring nuget packages",
    "postrestore": "echo runs after restoring nuget packages",
    "prepare": "echo runs after post restore / before prepack"
    "prepack": "echo runs before nuget packaging",
    "postpack": "echo runs after nuget packaging",
    "prebuild": "echo runs before building project",
    "postbuild": "echo runs after building project",
    }
    }

    View Slide

  26. "frameworks": {
    "netcoreapp1.0": {
    "imports": [
    "dotnet5.4",
    "dnxcore50",
    "portable-net45+win8"
    ]
    }
    }

    View Slide

  27. MyWebProject
    ├── Controllers
    ├── Views
    ├── wwwroot
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs

    View Slide

  28. public class Program {
    public static void Main(string[] args) {
    var host = new WebHostBuilder()
    .UseKestrel()
    .UseIISIntegration()
    .UseStartup()
    .Build();
    host.Run();
    }
    }

    View Slide

  29. MyWebProject
    ├── Controllers
    ├── Views
    ├── wwwroot
    ├ config.json
    ├ Program.cs
    ├ project.json
    └ Startup.cs

    View Slide

  30. public class Program {
    public static void Main(string[] args) {
    var host = new WebHostBuilder()
    .UseKestrel()
    .UseIISIntegration()
    .UseStartup()
    .Build();
    host.Run();
    }
    }

    View Slide

  31. public class Startup {
    public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory) {
    }
    public void ConfigureServices(IServiceCollection services) {
    }
    }

    View Slide

  32. public class Startup {
    public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory) {
    app.UseFileServer();
    app.UseSignalR();
    }
    }

    View Slide

  33. public class Startup {
    public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory) {
    app.UseFileServer();
    app.UseSignalR();
    app.UseMvc();
    }
    }

    View Slide

  34. public class Startup {
    public void ConfigureServices(IServiceCollection services) {
    services.AddSignalR();
    }
    }

    View Slide

  35. public class Startup {
    public void ConfigureServices(IServiceCollection services) {
    services.AddSignalR();
    services.AddMvc();
    }
    }

    View Slide

  36. public class Startup {
    public void ConfigureServices(IServiceCollection services) {
    services.AddSignalR();
    services.AddMvc();
    services.AddTransient();
    services.AddSingleton();
    }
    }

    View Slide

  37. public class Startup {
    public void ConfigureServices(IServiceCollection services) {
    services.AddSignalR();
    services.AddMvc();
    services.AddTransient();
    services.AddSingleton();
    }
    }

    View Slide

  38. public class HomeController : Controller {
    public IWidgetService Widgets { get; set; }
    public HomeController(IWidgetService widgetService) {
    Widgets = widgetService;
    }
    }

    View Slide

  39. public class HomeController : Controller {
    [Activate]
    public IWidgetService Widgets { get; set; }
    }

    View Slide

  40. MyWebProject
    ├── Controllers
    ├── Views
    ├── wwwroot
    ├ Program.cs
    ├ config.json
    ├ project.json
    └ Startup.cs

    View Slide

  41. {
    "Twilio": {
    "Account": "abcdef0123456789",
    "AuthToken": "fedcba9876543210"
    },
    "Data": {
    "DefaultConnection": {
    "Connectionstring": "Server=.;Database=MyDatabase;"
    }
    }
    }

    View Slide

  42. {
    "dependencies": {
    "Microsoft.AspNetCore.Mvc": "1.0.0-*",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-*",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0-*",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-*"
    }
    }

    View Slide

  43. {
    "dependencies": {
    "Microsoft.AspNetCore.Mvc": "1.0.0-*",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-*",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0-*",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-*"
    "Microsoft.Extensions.Configuration.Xml": "1.0.0-*"
    "Microsoft.Extensions.Configuration.Ini": "1.0.0-*"
    }
    }

    View Slide

  44. public class Startup {
    public void Startup() {
    Configuration = new ConfigurationBuilder()
    .AddJsonFile("Config.json")
    .Build();
    }
    public IConfigurationRoot Configuration { get; set; }
    public void Configure(IApplicationBuilder app) {
    var twilioAccount = Configuration.Get("Twilio:Account");
    }

    View Slide

  45. public class Startup {
    public void Startup() {
    Configuration = new ConfigurationBuilder()
    .AddJsonFile("config.json")
    .Build();
    }
    public IConfigurationRoot Configuration { get; set; }
    public void Configure(IApplicationBuilder app) {
    var twilioAccount = Configuration.Get("Twilio:Account");
    }

    View Slide

  46. public class Startup {
    public void Startup() {
    Configuration = new ConfigurationBuilder()
    .AddJsonFile("config.json")
    .Build();
    }
    public IConfigurationRoot Configuration { get; set; }
    public void Configure(IApplicationBuilder app) {
    var twilioAccount = Configuration.Get("Twilio:Account");
    }

    View Slide

  47. tools & platform

    View Slide

  48. View Slide

  49. View Slide

  50. View Slide

  51. ┌────┼────┐

    View Slide

  52. └────┼────┘

    View Slide

  53. View Slide

  54. View Slide

  55. View Slide

  56. View Slide

  57. # ? %

    View Slide






  58. View Slide

  59. # ? %

    View Slide











  60. View Slide

  61. getting started

    View Slide

  62. &
    dotnet/core
    microsoft.com/net/core
    MIT license
    !

    View Slide

  63. dotnet
    '

    View Slide

  64. dotnet new
    '

    View Slide

  65. Created new C# project in...
    '
    dotnet new
    '

    View Slide

  66. '
    yeoman/yo
    npm install -g yo
    BSD license
    !

    View Slide

  67. npm install -g generator-aspnet
    '

    View Slide

  68. yo aspnet
    '

    View Slide

  69. ./MyWebProject/
    ├── wwwroot
    ├ Program.cs
    ├ project.json
    └ Startup.cs

    View Slide

  70. .NET CLI

    View Slide

  71. dotnet restore
    '

    View Slide

  72. Microsoft.AspNetCore.Mvc 1.0.0
    Microsoft.AspNetCore.Mvc.Razor 1.0.0
    Microsoft.AspNetCore.Mvc.Cors 1.0.0
    Microsoft.AspNetCore.Mvc.Core 1.0.0
    dotnet restore
    '
    '

    View Slide

  73. Microsoft.AspNetCore.Mvc 1.0.0
    Microsoft.AspNetCore.Mvc.Razor 1.0.0
    Microsoft.AspNetCore.Mvc.Cors 1.0.0
    Microsoft.AspNetCore.Mvc.Core 1.0.0
    nuget install Microsoft.AspNetCore.Mvc
    '
    '

    View Slide

  74. dotnet new
    dotnet restore
    dotnet build
    dotnet run
    dotnet pack
    dotnet publish
    dotnet test
    ' # initialize a project
    # restore NuGet packages
    # compile the project
    # compile and execute
    # bundle NuGet package
    # publish application
    # run the project unit tests

    View Slide


  75. ) dotnet run
    '
    dotnet run
    '

    View Slide

  76.  dotnet run
    '
    Hosting environment: Production
    Now listening on:
    http://localhost:5000
    Application started.
    Press Ctrl+C to shut down.

    View Slide

  77. workflow

    View Slide

  78. workflow

    View Slide

  79. workflow

    View Slide

  80. workflow

    View Slide

  81. workflow

    View Slide

  82. OmniSharp

    View Slide

  83. &
    omnisharp
    omnisharp.net
    MIT license
    !

    View Slide

  84. View Slide

  85. Task Runner Exp.

    View Slide

  86. &
    Visual Studio 2013:
    bit.ly/vs-trx
    MS Prerelease license

    View Slide

  87. Packaged with
    Visual Studio 2015

    View Slide

  88. View Slide

  89. learn more
    ! aspnet/home
    & asp.net
    * live.asp.net

    View Slide

  90. discussion
    ! aspnet/home
    + jabbr.net/#/rooms/AspNetCore

    View Slide

  91. sample code
    ! aspnet/musicstore
    ! aspnet/bugtracker

    View Slide

  92. install dotnetcore
    N E X T S T E P S

    View Slide

  93. make awesome

    View Slide

  94. @ j a y h a r r i s
    # a s p N e t Re b o o t
    [email protected]

    View Slide