 All right. It's ASP.NET Core time. Yeah, that's right. So this is Sayed Ibrahim Hashimi, and he's a PM on the Visual Studio for Mac team that focuses on web tools and ASP.NET Core. Yeah, that's exactly right. So great. Let's dig in. All right. Cool. So yeah, let's go ahead and get started here. The first thing we're going to take a look at is what are the different types of projects you can create for ASP.NET Core and .NET Core with inside Visual Studio for Mac. Then we'll start moving on from there. All right. Let me open up my Visual Studio for Mac here. I'll go into a new solution. We'll take a quick tour here. Most of the templates that you're going to be looking for are under the .NET Core node here. So these are the same exact templates that are available in Visual Studio when running on Windows and also from .NET new out of the .NET CLI. That's a really cool thing that it's built on top of that same scaffolding system. Yeah, that's right. So when we first created .NET new, we did create it with the mind that there's going to be multiple different hosts. Yeah. I like that about this too, that you worked on that experience early on. So it's cool to see that. That's right. Yeah. That's honestly one of the things I'm really proud of is the .NET new and the template engine. I think it's really great experience for template authors. Creating and maintaining templates in the past was really hard. So it's cool that those same templates work across the different experiences, including Visual Studio. So yeah, exactly. Then you can imagine in the future, maybe we have some additional hosts as well. There's nothing to say that can be a web host. So yeah, you never know what we can do with that. So yeah, definitely. It's very cool that they're the same exact templates across everywhere that we are. So especially if you're working on a team and you've got some people using Visual Studio for Windows and some on Visual Studio Code, some on Visual Studio for Mac, or whatever editor to know that they're all going to have that same experience with that. So yeah, exactly. When we're creating the tooling features for ASP.NET Core, that's one of our main focus points is, you should be able to have a mixed team. Let's say for example, if I'm using Visual Studio for Mac and John is using Windows with Visual Studio, and then we got some colleagues that might be using, let's say Visual Studio Code on Linux, they should all be able to party together and create the same applications and have the same features. So the synergy between Visual Studio for Mac and Visual Studio is a little bit higher than let's say Visual Studio and Visual Studio Code, because on the Visual Studio for Mac side, we've got an understanding of the solution file and the assets in the same exact way that Visual Studio itself has. And the IDE feel to it too, right? Yeah, of course. So that's the other big difference. People ask me, what's the difference between Visual Studio Code and Visual Studio for Mac? And the answer is, Visual Studio for Mac is an IDE that has all the integrated features. It's kind of like a one-stop shop or that's kind of our goal to make it into a one-stop shop versus let's say Visual Studio Code. If you're more oriented around editing your code and running command line utilities and that's how you feel productive. And you don't need wizards like New Project or publishing wizards. That's where the Visual Studio Code comes in. Which kind of brings us back to this point here we're looking at, which is creating a new project. When I create a new project, sometimes if I'm up and running, editing a project with Visual Studio Code, that can work okay for me, but creating a new project, I'm going over to the docs because I need all the command line things. So what do you got for us here as far as the templates? Yeah, so here we have, inside the .NET Core node, we have kind of three sub nodes here, app, library and tests. And we'll take a look at each one of these very quickly as well. So here we can see we've got console and worker service, but we're going to be focusing more on the ASP.NET Core section here. Let me go into a Blazor server application. And let me also say some of the things that I'm going to be showing in this talk will be in our 8.5 release that theoretically should go out tomorrow. So if you try something with 8.4 today that you don't see available in your build, hold on until tomorrow and install the update and then those features should light up as well. So some of the stuff I will show is in that 8.5 release. All right, so let me create a Blazor server application here. So after I go into it, we can see we've got a choice for authentication here. So on Windows, they have a few additional choices to authentication. You can also create applications that use Azure for authentication, but the vast majority of projects created with Auth are created with individual in-app authentication. Right, right. That's the support that we've brought over for this release. And obviously we're going to augment this and kind of expand the capabilities, but we feel like this is the most important. But like you said, this is the one I almost always use this. Yeah, you know, the data shows, I think it's a part of like close to 90% of projects with Auth use individual in-app authentication. Great, great. Okay. That's right, yep. So let me go ahead and create this Blazor server application here. Just give it a name and click create there. And yeah, so this is like what you said, it's going to call .NET new or it's going to call, so .NET new and Visual Studio, they sit on top of the template engine. So this will call into the template engine to create the project with Auth enabled. And here we can see when you create a project on Mac, instead of using SQL Server Local DB, we use SQL Lite. And that's also true for .NET new as well. Let me go ahead and build and run this. What I'll do is I'll use the play button here. Oh yeah, and I have to restore my NuGet packages. That's an option that I've went out of my way to enable is I want to manually restore my NuGet packages. That's just kind of my workflow. Yeah. But by default, it will automatically restore your NuGet packages, so most people wouldn't see that dialogue. So let me go ahead and I click the play button here, that's going to start debugging and very kind of similar experience to what you have in Visual Studio. So this is creating a Blazor server application, which is like single-page application style, but you've got authentication set up for that. Yeah, that's correct. Okay. Yep, yep. All right, let me go ahead and register an account here. All right. Oh yeah, and then for the password, there's some... Oh, wait, yours? No, I know, I know. Oh, okay. There's some very particular password requirements here. So you always want to have a nice strong password. I just learned to have one. One uppercase, one lowercase, one special character, one digit. I believe it is. I know, yeah. So I always like that. One unit code character. Yeah, your firstborn child, stuff like that. So basically what happened was, I registered an account and then there's a confirmation step, so I just clicked to confirm that account. But in a real app, you might send an email and user would click that link inside of an email there. Great. Let me go ahead and log in here. All right. So let's go ahead and log in. So now basically what happened was, when we created the project, it was created with the individual and app authentication enabled. Right. And then that also came with a SQLite database that was pre-warmed up for the migrations and schema. And then we registered a new user and then we logged in with basically almost kind of zero effort here. Right. Basically, yeah. So that's the idea there on me. Let me just go ahead and close out of this. Let's continue our kind of exploration of the new project. There were some things that I forgot to talk about there. So we already talked about the ASP.NET Core node here. We've got the same templates that we'll find in Visual Studio. Under Library Project, that's where you'll create your .NET standard class library. Yeah. For unit tests. And we'll take a look at unit tests hopefully if we have time in a little bit towards the end. But we support these three different flavors of unit tests. Yep. And then the only kind of node outside of .NET Core that most of our viewers are going to be interested in for .NET Core is under the Cloud node for Azure Functions. Yeah. So if you're developing Azure Functions, you'll go into the Cloud node there. And we've got a session coming up just for that. Yep. Holland's going to be showing that. That's right. That's right. So that's what we got going on there. We already talked about those things. Why don't we switch over to another feature that's coming out in 8.5. Actually, it was released in 8.4, but I think users, I think the viewers should wait for 8.5 to try these out. And that's what's scaffolding. Let me go ahead and close out of that instance. Let me go back to, okay, here it is, right. Okay, but so what I want to do, I want everybody to know that we have a really kind of great Dock that's available in our Microsoft Docks here. And there's a link to this at the end. Yeah, what's cool with this, too, by the way, I think a lot of people don't know. These are the straight up ASP.NET Core Docks. And then if you scroll down, or I guess go to another one of them in here. Yep. We have these different tabs. So you'll see there, Visual Studio for Mac. And when you switch that, it switches it for all of them. Yeah, that's right. So we work together on these over December, January, time frame, updating them. Yeah, that's right. So, but it is cool as these new features come out, we were going through and updating for things like scaffolding support. Yeah, you know, it is pretty cool. And the whole goal with these tabs is, you know, we should have the same exact content, whether it's Visual Studio or Visual Studio for Mac. But the screenshots would be different, right? That's kind of the goal. We're not 100% there yet. But you know, we're making progress every day, basically. As we were updating these two, we did find some cases where it's like, wait a minute, this is slightly different. I have to drop to command line. And then we filed bugs. And it was, I love that working with you on this and watching it get updated. I think that's in 8.5. 8.5, yeah, that's right. Yeah, so for scaffolding, it was actually released in 8.4. For razor pages, but not for MVC. Yeah, that's right. And to be honest with you, we did find some kind of issues with scaffolding in 8.4. Fortunately, 8.5, like you said, it's back to this week. That's right. In 8.5, you're going to get a much kind of better scaffolding experience out of Visual Studio for Mac. So I think, you know, let's just wait another 24 hours, hopefully, and then take that one. Cool. Yeah, so this is actually the sample that I've got open is actually created from this dock here. Okay. So people want to follow along. We'll have a link to this tutorial at the very end of the day. That's right. But it's the razor pages movie sample. Yeah, that's exactly right. Razor pages movie, and you know, it's from start to finish, basically, file a new project to having a whole entire application running here. So I've already created this model class, which I just kind of copy and pasted from the dock itself. So now what we'll do is right click and say add new scaffolding. For this one, I'm going to pick razor pages with any framework crud. So that's the one that will create several files for you. You know, if it'll do create, read, update, delete, details, and then also an index file there as well. All right, so for model class to use, I've got my movie model, and then here, you would just basically type in whatever name for the database context that you want. I think it's just razor pages movie, movie context. Yep, and then one thing that I forgot to point out was the area that you right click in the solution pad, you know, the folder that you right click there is going to be where these files will be generated. Right, so in this case, I was under pages movie that I right clicked add new scaffolding, right? Let's go ahead and click finish here. This is also a pretty kind of similar experience to Visual Studio, the UI is a little bit different. They have like kind of a tree view there, and we have more of a list view. But you know, just like with .NET new, and this also was something that I worked on in Visual Studio with scaffolding. When we created scaffolding, we also kind of had that same mindset saying, you know, first, we're going to kind of surface it in Visual Studio, and we'll also surface it on the command line, and then we'll also be able to surface it wherever else that we need to. So this is the first place. So you need to see that all come together. Yeah, right. And it's also kind of like Groundhog Day too, you know? It's like doing the same thing over and over again. It's like, hold on, I've built this feature before. Yeah, yeah. So then this has created those views then under the, or it's... It's creating them now, yeah. So actually there's a lot of stuff that goes on into this, you know? And I think this scaffolding really does kind of highlight the difference between editor and IDE, right? So if you were to do this manually, you know, you'd have to modify your project file to add a bunch of new packages at the tool to the project itself, and then you'd have to run, and then just running the ASP.NET code generator on the command line is like a huge call, and that's very easy to kind of, here it is right here, actually, you can see it calling it. And it's obvious if you flip the different tabs in that tutorial, you'll see if you do the Visual Studio code approach, it's like run this, do this, you make a typo, you're in trouble. Yeah, look at this command line here. Do you know what I mean? It's got to be more than like 100 characters here, you know? There's no chance you can type that in without some sort of an error. Right, right. So that I think kind of highlights the difference. So now it's basically just kind of completed, so, or finishing, completing. And that's just the first time that it does this, right? After I've got that set up, then I've got all this scaffolding support. That's right, yeah. So the first time that you do scaffolding for a project, it will take a little bit more time because they got to add the NuGet packages and the tool. But after that, it's a lot faster. So let's go take a look at some of the content that was created here. So I've got my index page here. And then we can see the other ones that we kind of mentioned before. And before I showed you that we can start debugging this with the play sign, we can also do start without debugging. And normally I do start without debugging, unless I'm really trying to debug something. A little bit faster. It's a little bit faster. So yeah, it saves you a few seconds, but you know those seconds they will definitely add up over time obviously. All right, so we've got our app created here. I'm going to go to slash movies. And oh, oh, actually, you know what? My bad. There was a couple of steps that I forgot to mention. So let me go back to the tutorial here. So basically what happened was we scaffolded out the content. And now what we need to do is to kind of set up our database here. Right, so that's where we'll go to here. I'm going to copy a couple of commands here. Oh, actually, you know what? As you're doing that, let me talk while you type. One cool feature that we've got planned for 86, which is in the May timeframe is an integrated terminal. So right now, I mean, you can use any terminal you like, high-term or whatever, but that's a cool feature coming out with 86 so that I can directly in Visual Studio for Mac itself I can do that. That's right. So what you're doing now is you're actually scaffolding created the migration, but we actually need to run the migration and create the tables and that kind of stuff. Yeah, yeah, that's right. Well, actually what happened was scaffolding, so we had a model, it created a database context, but the migrations were not created yet. So what we're doing right now is actually creating the, creating the initial migration, and the migrations will be stored in your project as well, and then the next command. Oh, okay, so yeah, if you ever get this error when you're doing scaffolding, that means that you're probably running your app, which I'm doing here. So the DLLs are basically locked. So I've run into that a bunch of times before, so if you ever run into that, that's a good thing to know. So yeah, so now it's gonna go through and it's gonna create the initial migration and then build it and everything. Now what we're gonna do is go and actually update the database itself. In this case, it will actually create the database. So the first was setting up the migrations and this is actually running the migrations which will create the database tables. So create the database and the tables. The first step was creating the migration, and that's like some .cs file, and then this one is actually running the migration. So that's what we've done. If I go back to my project here, I can see now I have a .db file. That's the SQLite file there. Let's do start without debugging one more time and then hopefully we'll be able to go and create like one or two movies. Sounds good. And then go from there, yeah, right. All right, there we go. So let's say create new and I'll say, I don't know what year, I should have gotten more prepared and actually figured out all this information. You know what I mean? And it's pretty small, it's hard to see. Oh, okay, got it. Let's zoom in a little bit. Ah, yeah. All right, so let's create that. All right, so we've created one. You know, obviously we could create another one as well but that doesn't really matter. Let's go into edit here. So these are all pages that were just created from that scaffolding step, right? And working against the live database. Exactly, working against that live database. So you can see here, I've got a good scaffolding for an app here. Then I'm gonna have to go through and kind of fill it in and kind of polish it and make it to be my own. But at the end of the day, I can create new movies, I can edit those movies, I can delete those movies, I can inspect the details of those movies. A lot of really great functionality here with pretty much low effort here as well. That's the idea of an IDE is to help you be more kind of productive. Yeah, and like you pointed out, those files afterwards are yours to edit. Like those views, I can go in and change them however I want to, but I don't have to name a title of the movie, date, time, map everything back and forth. That's grunt work to do that. Yeah, exactly, that's right. Yep, that's right. Cool. All right, so that's what we've got scaffolding wise. Let's go to the next slide here and see what we're gonna do now. So now we're gonna take a closer look at building and running the applications. So one big thing there is launch settings.json support. And I actually created launch settings.json support. So that actually first showed up as a Visual Studio feature. It's groundhog there. Yeah, and then the user said, hey, I need launch settings.json support at the command line. And then we added it at the command line. So what's the point of launch settings.json? Yeah, so launch settings.json is really a developer file, so let's go and let me open up this other project that I have here. So launch settings.json is a JSON file that declares how your application should start. Okay. Yeah, so we can have things in there like the URL to the file. Got too many files open here, I think. Just one second. There we go. Okay, yeah. So we can see with launch settings.json, you can have multiple kind of profiles is what they're called. But it basically will declare how your application will start for development. Launch settings.json is only used in developer scenarios. It's not used in any production scenario, and it's not even published at file. Got it. So some things that we can see here are the environment variables, including expanded core environment, so this is the one where when you're doing development, you want that environment variable to be set to development, but when you're in production, you want it to be to production or something besides development. That's a really important feature of ASP.NET Core. A lot of developers I talked to don't really understand that enough how important environment variables are, because you can set them like you're saying here in launch settings, and then when I deploy it, like say to a web server, a Nginx or maybe to Azure, I can go into Azure and set those app settings there. You know what I mean? And override those. That's right. Cool. Yep. So yeah, and then also the application URL. So now let me show you how we could modify this one. So on the web app here, I will choose options. Obviously, you could edit that file directly if you wanted to. Yeah. So that's kind of one choice. If I were to go in here, and then let's say I'm going to add a new kind of environment variable here. So I'll say demo, demo value. I escaped it. Then let's click OK on that one. Did I? Oh, I think I got the wrong one. Oh, wrong one. Wrong one open here. Yeah, I think I had the wrong one open here. But anyways. So as opposed to like messing with JSON schema I can go in and edit it in there and it'll update it for me. Yeah. And then the great thing is, you know, your Visual Studio Counterpart or your Visual Studio Code Counterpart would get those kind of same settings and run behavior as well. Right, right. That's right. Yep. Cool. So that's the launch settings that JSON support and so now here I've opened up a different solution that I've been developing for a while here. I'd say it's an app that shows templates that are available for .NET new. Oh, nice. So there's a couple things I want to show you here that we've recently added here. So one is the browser selector. Let me zoom in on this a little bit. So browser selector. So here it will show you whatever browsers you have installed. And that's picked up from Mac OS like it looks at your registered browsers. Yeah. So in Mac OS and the settings, you know, there's a place where you can choose the default browser and the items that show up in this list are the same exact items that show up in that list. Even some things that are unexpected here, but that is how they're registering themselves as browsers and they actually do work somewhat as browsers as well. So here we can see I can choose my different browser. And the behavior in Visual Studio for Mac is slightly different from Visual Studio. So with Visual Studio for Mac, the setting is kind of stored with the project itself and it kind of travels with the project. I actually kind of like that. In Visual Studio, it's more of a global kind of setting for all your projects and solutions. So there is that difference there. Another thing I wanted to show you here, as we take a look here, this.NET new web app, the kind of architecture is, there's a razor pages front end, but the back end is an ASP.NET core web API project, right? I think I know where you're going with this. It's always a pain where I'll start up my web project and then I'll think, oh no, I forgot to start up my API and my web app depends on the API and it's not working, and larger projects may have four or five projects. Yeah, easy. That's right. Yeah. So now, so what I want to do is I want to launch my API project and my web project at the same time, whenever I start with or without debugging. So I'm going to right-click on the solution and say set startup projects. And this is also an area that has a little bit difference in how it's actually been implemented, but we try to offer the same kind of feeling for it, right? So in Visual Studio for Mac, we have this thing called run configurations, and Visual Studio doesn't have that. So in Visual Studio for Mac, you can create several different run configurations. So let's say if you had a huge solution with 20 projects, and if you're testing one microservice, you want to start up these three projects, and if you're testing a different microservice, you want to start up these other four projects. Right. You can achieve that with run configurations and then you can easily switch back for it. Toggle between those different configurations. But for the basic case, you're going to use it just like you do in Visual Studio. There's just this additional click to create the run configuration. So here I can select the different projects that I want to start. So I'll pick the API and the web project, and then we'll click okay for that. And we can see this value has just changed, right? Before, I think it was set to templates API, right? That's the one that this is the selector where you pick what you want to run, right? So if you wanted to change back to just the API or something, you could do that. Yeah, exactly. That's right. So we'll keep it on multiple projects here, and then we'll start without debugging. The keyboard shortcut is option command return. And so yeah, we'll see this is going to go in and fire up the, so we can see here it fired up our API project here, as well as our web application here. But let me go back and what I want to do is actually start with debugging here. So let me do command return on that one. While you're doing that, I just want to point out those keyboard shortcuts are really cool, and you've been working to get together some of the top keyboard shortcuts. And one of the giveaways we have during the code party at the end of the day is we actually have coffee mugs with some of the top keyboard shortcuts. Right, right, right. And we have, so we've created PDF files. That's right. Yeah, yeah. We have two different versions. The Visual Studio for Mac shortcuts by themselves. And then we also have a, we have another PDF that compares Visual Studio and Visual Studio for Mac shortcuts. So if you're used to Visual Studio for Windows, then you can go over to Visual Studio for Mac and line up which the shortcuts are. Yeah, that's right. And we'll be sharing those out during, I think Mikaela and Kendra's session on productivity at the end of the day, they're going to be sharing that. So, cool. Yeah, that's right, yeah. So they're going to have a link to it. And if I recall correctly, the link is aka.ms-vsm-keyboard-shortcuts. But they'll have the links there. They'll definitely have the links there. And I'm working on updating the dock as well to have those links. Cool. So what I've done is, so here I've started debugging here and I hit a break point. So I wanted to show, you know, kind of a couple debugging features that we have here. So obviously break points is one of them. And we can see now where we've stopped on a break point. Yeah. So we're going to inspecting the variables. We can also do things like step over. So let me go ahead and step over here. Did you do run without debugging? No, I did start with debugging. Yeah, that's right. Yep. Very cool. Let me do, let's turn this break point off. Let me show a new feature that we have. It would be run to cursor. Nice. So let's go ahead and do that. So run to cursor, basically what that does is, wherever the debugger has paused at, then you do run to cursor. It will continue execution until it gets to that particular location. Great. Okay. But I'll contrast that with a different feature that I'll show you next. So here we can see that, you know, you can inspect your variables here, whether they be lists or whatnot. Then you can also edit these values here. So let's say, you know, I want to say, hey, John G is the author of this one instead of Microsoft, right? So I can do things like that as well. So yeah, similar kind of features as to what's available in Windows. So you can edit variables in two places then. One is during those, in those inspectors, and then there's also the whole, the quick watch. The watch windows. Yeah, so I have them down here, but let me show you in case those pads are not available here, the way that you would get into it is view debug pads. And let's say if I go into watch here. If you're new to Visual Studio for Mac, that's a new concept that I had to pick up was pads. Pads is a term is that's what you're looking for. That's right, that's right. So pads are, you know, kind of in Visual Studio, we would probably call them tool panes or panes, right? So those are what pads are, right? Like we've got the solution pad or the output pad or the watch pad or the locals pad. So yeah, that's right. So yeah, we've got the watch pad, the locals pad, the immediate pad is over here too somewhere. I think maybe I don't have it open, but it's available in that location that I just showed. Cool. So I just showed how we can kind of inspect and edit variables, one of the, so let's say in this case, you know, I got this call to template packs and it's calling this method here. And let's say the value was something that I wasn't expecting and I wanted to kind of redo that step, right? What I would do is I could right click and say set next statement. So earlier we talked about run to cursor, right? So I said with run to cursor, wherever the debugger's paused, you put your cursor on a different location, you say run to cursor, it would just continue an execution of your application, whenever it gets to that line, then the debugger pauses again. So it's kind of like setting a break point and saying run kind of, it's saying, go ahead and run and run until I get it. That's exactly what run to cursor is. Yeah, it's like almost a temporary break point. So this is different here, set next statement. You're actually saying, I don't care where you're at in the program, go here. Exactly, that's right. That's right, yeah. Set next statement is very kind of invasive, I guess, kind of, right? It doesn't matter where you were at before, it literally changes the next line of code to that point. So if you set your next statement to like weird places, you might have problems. Yeah, you may get no reference or whatever. Let's say if you go outside of your method into a different method, you might have some exceptions there, obviously, but you'll have the same experience in Windows. But normally this is used for, you make a call to some sort of a method, it comes back with some weird result and you just want to do it again and maybe step into that method this time, right? Got it. So that's what I did. So I just did set next statement and then we can see now the debuggers here basically ready to kind of party on with it. Let's go ahead and stop that one. So another feature that we've added recently is the ability to kind of manage new get packages at the solution level. I think this was either 8.3 or 8.4. So I just right-click the solution and said manage new get packages. If I go to the update tab here, we can see that there's a few packages here that I could update, right? So let's say for example, if I wanted to update my newtonsoft.json, I could select that package and then pick update packages and then I'll be prompted for what projects do you want to update these packages for? And since it's a solution level, it'll look across all those projects. Yeah, that are using that particular package, right? That's right. I'm not going to do that here, but we definitely could do that. All right. Okay, so let me go into, let's take a look at some of the kind of editor features that we have, right? And we've recently ported over the same exact editors from Visual Studio into Visual Studio for Mac. So the editing experience should be pretty familiar. One of the things that I wanted to kind of highlight here is the multi-carat editing. So here I've got a list here and let's say I want to add one class to each list item here. So I've put my cursor where I want the first one. So what I'll do is a control option click to create another carat and another one. And let's say I just want to add a new class for highlights. So that's in a multi-carat editing and that works in a variety of different files in Visual Studio for Mac as well. Nice. We're kind of near the end here. Let's, we should switch over to, I guess the slides where we can show people where to find out more stuff. Oh yeah, great idea, yeah, right. I'm not very good with slides, you know? He's like, I just got all demos and I'm like, let me throw some slides at you, throw you off. Yeah, so obviously like basically every, every side deck we're ending up with, like download the newest Visual Studio for Mac. And like you said, 8.5 expected out this week has some cool, cool updates. Definitely, definitely a lot of cool updates for sure. Yeah, right. And then that Razor Pages tutorial, the Razor Pages movie, that was one that we both updated, you did all the work, I did a few things and that was, that one also we've got linked here and that's the one that showed scaffolding. That's right, that's right. That's a really cool tutorial and there's also kind of an MVC counterpart for that as well, yeah. Awesome. So I think now we're ready to take some questions. Okay, great, awesome. Great stuff. So much goodness for ASPnet core developers on VS for Mac. All the additions that we've added through the last few months make the productivity so much better. So we have a couple of questions but first I wanted to give a shout out to Anze here because as we were having the previous session, Anze is part of the product team but what's exciting is that he was actually watching the show. He's like, I feel so inspired now. I need to go back and use the product more. So he's a Visual Studio for Mac PM and he loves the product so much. He felt inspired from our session. So it's great, inspiring our own people. We have a question for you, Said and John. When should I use GRPC over traditional APIs? Like people want to know about which one is better now? Yeah, right. Sure, okay, yeah. So I think that would have been a really great question for our previous presenter, Brady Gaster. I think he could have given a better answer to that but let me try and answer it. So I think GRPC services are more preferred when you're communicating within your own applications. Right, like let's say you have an application that consists of several microservices and you want a high-performance experience of the communicating between these different applications. That's one area that you would use GRPC. But I think if you were to contrast it, let's say if you want to just create an API that anybody could access, right? I don't think GRPC is the right approach for that. But I'm not quite sure. Yeah, GRPC is a binary format, very high-performance, but like you said, it's a little harder to share and you were requiring also support. Not every browser supports GRPC, not every client can support that. It requires HTTP too and all that. So yeah, I agree with you. I think for internal services, you want that really high-performance and you have control over client and the service. Yeah, GRPC, but for something you're sharing, I agree with you, the REST APIs is right there. Yeah, that's right. Cool. Great stuff. So GRPC, it's fairly new as well and we saw before that it's very well-supported inside VS for Mac and there'll be more support coming soon. Now, the next one is going to be about deploying Espen Accord to Docker. And I think the question here is how well is Docker supported with VS for Mac? Oh, sure, right, yeah, yeah, right, okay, great. So yeah, so if I have an application here, what I can do is I can right-click on my project and say add Docker support here and this will then create a new project called Docker Compose and that will be set to the startup project and it's kind of similar to the features in Visual Studio. They do have some additional features on the Windows side, but that's an area that we're looking for kind of feedback and we're trying to figure out what missing features should we kind of implement first. But like the main things you were saying that it does for you is set up the Docker file and set up the project support for it. Yeah, that's right. And it does it in a way that would work with Visual Studio users as well. Cool. Yeah, that's right, yeah, great question, yeah. So there you have it. We have ASnet Core, high-performance GRPC, REST APIs, Docker support, microservices, all supported inside Visual Studio for Mac. Now, before we jump into our next session with Jeff to talk about serverless awesomeness on a Mac with .NET Core, we're gonna take a quick break. So stay tuned and we'll see you in a bit.