Speaker 1: Hello, and welcome to another episode of the Gingers in
Speaker 1: dot Net. I'm John Klebby. Your host with me today
Speaker 1: is Caleb Wells.
Speaker 2: Hey y'all. How's it going?
Speaker 1: Hey y'all?
Speaker 2: So you and I Yeah, Hey, that right, the original
Speaker 2: two amigos. It's been a fun ride so.
Speaker 1: Far, I think so. I mean we're a little past
Speaker 1: a year when we first started. Yeah, I think you
Speaker 1: know that we're getting more listeners. So thanks to all
Speaker 1: the people that are out there, it's doing great. We
Speaker 1: hope that you're enjoying the show and you know, keep
Speaker 1: up the listening, spread the word and give us feedback.
Speaker 2: Yeah. Absolutely, So what do you.
Speaker 1: Want to cover today? It's just you and me. We
Speaker 1: don't have a guest to talk about.
Speaker 2: So figured we could talk a little bit about my
Speaker 2: new job. Not the company or the clients, but the
Speaker 2: code right. I have come into a fairly well developed application.
Speaker 2: They've been working on it for maybe nine months or
Speaker 2: something like that. But everything is in net right, which
Speaker 2: is our wheelhouse, and it's all in VC. You know,
Speaker 2: it's all Azure and some of the stuff is you know,
Speaker 2: stuff that I haven't worked with in a while, or
Speaker 2: we're with at all. So it's been it's been interesting
Speaker 2: to kind of come back into this realm where front
Speaker 2: end middleware back in the whole deal is all Microsoft products.
Speaker 1: So the entire stack. No, no front end frameworkscript framework
Speaker 1: R in it.
Speaker 2: No Angular, No, well not not in this project. Well
Speaker 2: we'll see going down the road there the company work
Speaker 2: forward there there honestly the pretty technology agnostic and so
Speaker 2: you know, I've been told that, you know, if another
Speaker 2: project comes along and I move to that, I can choose.
Speaker 2: But that's when they just choose to stick with I
Speaker 2: guess Microsoft, because they're using a lot of the Azure
Speaker 2: data analytics and data storage stuff. So they're using data
Speaker 2: Lake and power Bi and some Synaptics stuff, a bunch
Speaker 2: of stuff that I'm still digging into and learning. But
Speaker 2: the application, you know, is your typical class libraries, an
Speaker 2: NVC web app, and then a Blazer admin app, which
Speaker 2: I figured you would you get kick out of. Yeah,
Speaker 2: laser service side, okay, but yeah, you know, like like
Speaker 2: I said, they're they're pretty like you know, hey, if
Speaker 2: you can get to work and or any problems, you
Speaker 2: can use whatever tech you want.
Speaker 1: How they helding state on the admin I guess that
Speaker 1: it's it's admin. It's not such a big deal if
Speaker 1: that it's not it's change reset does have any issues.
Speaker 2: Okay, Right up until this last sprint, admin was only
Speaker 2: accessible by people at my company, not any of the
Speaker 2: client users. I actually spent this sprint changing that to
Speaker 2: set up permissions and access because they want to start
Speaker 2: letting some of their users into the admin site. But again,
Speaker 2: like you said, it's not it's not public facing, so
Speaker 2: that that's not not such a big concern. But I
Speaker 2: thought we could talk a little bit about m VC,
Speaker 2: and I don't you know, I don't know how significant
Speaker 2: these changes are in the past year, and for people
Speaker 2: who have been using it all along, they may not
Speaker 2: be it changes at all. But one of the things
Speaker 2: that I found really interesting is the Razor pages right,
Speaker 2: which is not it's not the original way in NVC right,
Speaker 2: which you've got separate classes and then separate HTML views
Speaker 2: right with Razor in them. It's not Blazer right, which
Speaker 2: has got all of kind of a MISSI mash inside
Speaker 2: of their own files. This is very similar to the
Speaker 2: old school code behind right, where you have a c
Speaker 2: S HTML and then you have a little arrow and
Speaker 2: you click the arrow and you get the code behind right,
Speaker 2: which at first it seems like maybe you're taking a
Speaker 2: step back, but once you start using it, it's really
Speaker 2: not the case. And one of the nice things is right,
Speaker 2: they're both there in the same place, easy, easily accessible.
Speaker 2: So but you know, dig in into that and that's
Speaker 2: been it's it's been interesting, but it's been good, you know,
Speaker 2: it's It definitely brings back memories.
Speaker 1: So it's all done. It's all done.
Speaker 2: Core yep, yep, all door, okap three point one, yes,
Speaker 2: three point one, okay, all right.
Speaker 1: Are they look going forward to dot net five coming
Speaker 1: out next month?
Speaker 2: I don't know that they're they're all that concerned about it, really.
Speaker 2: I'm looking forward to it. I think it'll be it'll
Speaker 2: be good. I don't know if this project will be
Speaker 2: transitioned and if it is when it's definitely kind of
Speaker 2: in a state of flux where we're having to add
Speaker 2: a lot of features and build on it and then
Speaker 2: go back and refactor the stuff we do wrong in
Speaker 2: the quirks and whatnot. But we'll see. I think dot
Speaker 2: net five is going to be great personally.
Speaker 1: I see I've seen the betas coming out for dot
Speaker 1: net five and been meaning this to fire something up
Speaker 1: and just kind of poke around a little bit and see,
Speaker 1: you know, how much does it feel different or is
Speaker 1: it just kind of just a normal evolution of dot net?
Speaker 2: Got you right? Right? Well, hopefully it won't fill that different. Yeah, yeah,
Speaker 2: because it feels different, then maybe they did something.
Speaker 1: Well yeah, I mean C sharp nine things like that.
Speaker 2: So yeah, yeah, yeah, but you know, so I've been
Speaker 2: been digging into the razor pages and you know, having
Speaker 2: to tweak startup files and environment variables and all that
Speaker 2: kind of stuff that's you know, anciilaria, but takes up,
Speaker 2: you know, a day or two, right when you run
Speaker 2: into an issue. One of the other things that they're
Speaker 2: using fairly heavily is areas in NBC. And I know
Speaker 2: areas have been around for a while now, years, maybe
Speaker 2: even before that Core I'm not not positive on that.
Speaker 2: But with this application, it's multi tenant, right, so our
Speaker 2: client is basically reselling this. When they get a client
Speaker 2: of theirs come in, we basically add in appropriate areas
Speaker 2: and update the canfig files and spare everything up for
Speaker 2: this new tenant, right and that, and that's really a
Speaker 2: perfect use case for areas, right.
Speaker 1: So I've never used areas and I heard of them,
Speaker 1: but I don't really don't know how they're used. So
Speaker 1: for our listeners, you know, tell us what what an
Speaker 1: area is and you know what us for.
Speaker 2: Yeah. So so right in NBC, you have your your
Speaker 2: index and your underscore layout page and your view imports,
Speaker 2: and if you start all the all that stuff that
Speaker 2: combines to make paging in VC right, areas is basically
Speaker 2: an extension of that, and it sits on top of
Speaker 2: your base set up and your base layout and your
Speaker 2: base index right. And so the way that we have
Speaker 2: it set up is you come into the website, you know,
Speaker 2: at the base r L, and you're shown you know,
Speaker 2: kind of the marketing selling stuff, right. But if you
Speaker 2: update the sub domain on the RL for one of
Speaker 2: our tenants, then we've got it set up to where
Speaker 2: it will actually go look in the areas for the
Speaker 2: tenant folder in the areas for that tenant, and inside
Speaker 2: of there you have your own version of log and
Speaker 2: partial underscore layout, index view imports. You don't have to,
Speaker 2: but in our case the way that we've developed it,
Speaker 2: each tenant has their own. Once they're on look and
Speaker 2: feel right and they want to have their own splash
Speaker 2: images and their own branding and all that. And this
Speaker 2: is a good use case for areas. Right. You can
Speaker 2: have one hundred and you still have a base layout
Speaker 2: and base CSS that everything derives from, but you can
Speaker 2: then tweak it on a case by case basis.
Speaker 1: So areas are kind of a way to organize everything
Speaker 1: and make everything that's grouped together, kind of way for
Speaker 1: a encapsulation or separation of concerns, that kind of thing.
Speaker 2: Yeah, right, right, because we don't want you to go
Speaker 2: to the website and get the look and feel and
Speaker 2: the info for one tenant on top of another. Right,
Speaker 2: And I'm sure there are obviously other ways areas can
Speaker 2: be used, but I just found this to be an
Speaker 2: interesting way that they've approached the multi tenant aspect of
Speaker 2: this application. So that was another thing that you know,
Speaker 2: I've dug into and picked up. One of the other
Speaker 2: interesting things that I'm having to do more of a
Speaker 2: deep dive into is power bi and power bi it's
Speaker 2: another Microsoft product. It's kind of like data analytics right
Speaker 2: on steroids.
Speaker 1: Right.
Speaker 2: You have users that go in and they can pull
Speaker 2: information from database stores and they can build charts and
Speaker 2: graphs and filters and all this aggregation of data, which
Speaker 2: is really the big selling point of our application. This
Speaker 2: application in particular actually started out tracking and managing COVID
Speaker 2: data for different hospitals or publicly accessible data that we
Speaker 2: pulled in, you know, and aggregated into one place and
Speaker 2: were able to see some trends, you know, and long
Speaker 2: term data modeling right and powerbon works in a number
Speaker 2: of ways, but in order to provide it to end
Speaker 2: users or customers who don't necessarily have access to it
Speaker 2: without paying extra licenses, you have to jump through some
Speaker 2: hoops to embed it into a web page for the
Speaker 2: end user. And they've got you know, this long wiki
Speaker 2: and a lot of documentation all they've got a playground.
Speaker 2: But power Beyon, I think, really is one of their
Speaker 2: newer offerings, right like in just the last couple of years,
Speaker 2: and so it's continued to and their added functionality and
Speaker 2: things are changing and you know, you kind of have
Speaker 2: to work around some of the limitations. So one of
Speaker 2: the interesting things that they've done is they're actually so
Speaker 2: they've created a partial that's used by all these areas,
Speaker 2: and inside that partial, it has an embed tag in
Speaker 2: it which basically becomes an iframe, right. But in order
Speaker 2: to populate that IMPEG tag with the appropriate data based
Speaker 2: on tenant, right and keep that segregation, they've actually created
Speaker 2: a tag helper, which is a built in functionality in
Speaker 2: the VC, but it allows you to basically target certain
Speaker 2: elements and tell it what attributes to look for and
Speaker 2: how you're going to be providing those attributes. And so
Speaker 2: what they've got set up is when you go to
Speaker 2: a tenant and you then log in and you're presented
Speaker 2: with a list of all the reports they have access to.
Speaker 2: When they click on one of them, it then starts
Speaker 2: this task process acing and it starts to build the
Speaker 2: view context for that page, and in our case, it's
Speaker 2: building it and then it's getting values out of the
Speaker 2: tag helper context and then pushing them into the viewbag
Speaker 2: for that page, which is interesting. And then it's pulling
Speaker 2: those attributes out of the view bag and pushing them
Speaker 2: into the embed, which then caused power beyond it says okay, yeah,
Speaker 2: you're legit, and it loads up the associated report. So
Speaker 2: I thought that this is something I haven't dug into
Speaker 2: much and hadn't really seen used in this way, but
Speaker 2: it's it works really well, it's it's honestly very it's
Speaker 2: an elegant way of doing it because, right, you have
Speaker 2: one tag helper class that is extending the Microsoft tag helper.
Speaker 2: You have one partial that's being reused among all of
Speaker 2: the areas, and then you just have to you know,
Speaker 2: embed that partial in the appropect page in the areas
Speaker 2: and you're off and running some cool stuff there. So
Speaker 2: this is all Azure, right, Yeah, all the power beised
Speaker 2: stuff exists in Azure.
Speaker 1: Yeah, everything for this application is it Azure or is
Speaker 1: it a hybrid model?
Speaker 2: Yeah, everything's Nasu're sorry. Yeah, we have the admin app
Speaker 2: and the web app, their apps running in Azure as services. Yeah,
Speaker 2: it's yeah. Locally though, of course, I'm I'm you know,
Speaker 2: testing on my machine. One interesting thing that they've set
Speaker 2: up though, and you just made me think of this,
Speaker 2: is this app also uses Cosmos dB a good bit, right,
Speaker 2: which is no SQL. You know, that's the simplified it's
Speaker 2: no SQL. But we don't have a local developer Cosmos
Speaker 2: or SQL server or anything like that. They actually have
Speaker 2: it set up inside of Azure to use your local
Speaker 2: one two seven zero dot zero dot one, but then
Speaker 2: use our staging keys and data and Azure ties that
Speaker 2: all in so locally, I can do an F five
Speaker 2: spin up my DEV and have access to all the
Speaker 2: data in staging locally because they're not.
Speaker 1: Using any of the emulators using no.
Speaker 2: No. I don't know if it's something that's common in Azure,
Speaker 2: but it's something that my coworkers got up and running,
Speaker 2: and it makes developments so much simpler, right, because it's
Speaker 2: one less thing you have to worry about. It's all
Speaker 2: managed somewhere.
Speaker 1: Else, right. And the project that I'm using, we started
Speaker 1: out using Cosmos TV and we switched over to using
Speaker 1: blob storage really as the storage mechanism because it's blob
Speaker 1: starts is a lot cheaper than Cosmos. Yeah, but then
Speaker 1: we're we're using their emulators for doing local development work.
Speaker 2: Okay, yeah, if you want, you and I can talk
Speaker 2: more about this offline. But I thought that was interesting.
Speaker 2: I was like, Oh, that actually works. He's like yeah, yeah.
Speaker 2: The only downside is we don't actually have and maybe
Speaker 2: it's not a downside. We don't have a dev environment
Speaker 2: for Cosmos or for power for any of that stuff.
Speaker 2: We just have a staging and a production and devn
Speaker 2: staging use the staging and in our case that actually
Speaker 2: works out well because, like you said, this stuff is expensive,
Speaker 2: you know, tens of thousands of dollars a month depending
Speaker 2: on how you're using it.
Speaker 1: Yeah, yeah, it's yeah, it's my project.
Speaker 2: You know.
Speaker 1: They've they've got week four different environments, you know, devs,
Speaker 1: a test stage, and a production type of type thing.
Speaker 1: And we're really looking at, you know, what is the
Speaker 1: most efficient use and that's why we went to you know,
Speaker 1: and we don't need that instant transaction ability that cosmosdb
Speaker 1: has that kind of load for the most part. If
Speaker 1: something comes to that point, we'll switch and use part
Speaker 1: Cosmo dB, but just using blob storage ends up working
Speaker 1: out well for us.
Speaker 2: Good, right, I guess a lot of it depends on
Speaker 2: the client too. Our client is not really concerned about money. Well,
Speaker 2: you know, as long as it's not one hundred thousand
Speaker 2: dollars a month, they're not contented.
Speaker 1: It's good to have clients like that, right, right.
Speaker 2: You know, that's actually one of the things my coworker
Speaker 2: said when I when I came on there, like, just
Speaker 2: so you know, this application is on the bleeding edge, right.
Speaker 2: Everything we're doing was either in preview or is still
Speaker 2: in preview, and so we're figuring it out as we
Speaker 2: go along. But I've been in it now for a month,
Speaker 2: and man, it works out well. The guys that I'm
Speaker 2: working with are smart, you know, they know what they're doing.
Speaker 2: They've you know, you have some red blocks and there's
Speaker 2: some things where you cut corners with the client. You come,
Speaker 2: I can clean it up, but oh no, it's it's
Speaker 2: well built and they've got a lot of the figured out,
Speaker 2: a lot of neat ways of utilizing the Microsoft Stack
Speaker 2: to benefit us in the client, you know, and have
Speaker 2: minimal time on, aren't you And you get a tenant
Speaker 2: spin up and it's not it's not a lot of
Speaker 2: rigmarole or a whole new application, right, So it's good.
Speaker 1: So you like the Bleeding Edge? Is that one of
Speaker 1: the things that kind of made you you don't want
Speaker 1: to switch?
Speaker 2: No, you know I switched because well it was it
Speaker 2: was time. You know. I like a challenge, right, Yes,
Speaker 2: I do like to push myself and I like figuring
Speaker 2: new things out. And I felt like I had kind
Speaker 2: of gotten in a bit of a runt, you know,
Speaker 2: I've gotten too comfortable in the last job. Bleeding Edge
Speaker 2: is nice as long as this not like cut your arteries,
Speaker 2: bleeding edge, you know what I mean?
Speaker 1: Yeah, I definitely know what you mean.
Speaker 2: Yeah, I like bleeding edge as long as it works,
Speaker 2: it's production ready and there's enough documentation for me to
Speaker 2: figure it out.
Speaker 1: Right.
Speaker 2: You don't have to be fully baked. It doesn't have
Speaker 2: to have you know, one hundreds of pages documentation. I
Speaker 2: just you know, you want a minimum, you have a
Speaker 2: minimum expectation of what it's going to do in a
Speaker 2: production environment, and then you know I can figure it
Speaker 2: out from there, right.
Speaker 1: Yeah, I gotta prefer to be on the cutting edge,
Speaker 1: not the not the bleeding edge, maybe the dull cutting edge.
Speaker 2: There you go, right, right, You're beyond web forms right
Speaker 2: at least for yep, yep.
Speaker 1: I am not working on web forms in my main
Speaker 1: position anymore right now. So I still do some side
Speaker 1: stuff that I've got to deal with the web forms,
Speaker 1: but I'm still trying to get out of those as
Speaker 1: quickly as possible.
Speaker 2: Yeah. Yeah, but no, it's amazing what you can do
Speaker 2: with just the net stack. And I guess you could
Speaker 2: really say that about anything, right if someone was a
Speaker 2: PHP wizard. It's like, it's amazing what you can do
Speaker 2: with PHP, right, But I don't do PHP. But you know,
Speaker 2: I think we've talked about this in previous episodes, where
Speaker 2: dot net is everywhere, right, and it just keeps, for
Speaker 2: lack of a better term, expanding and getting its tendrils
Speaker 2: and all these places you wouldn't necessarily expect Blazer, right,
Speaker 2: which to me makes the dot net framework that much
Speaker 2: more valuable for me, right because it is it is
Speaker 2: my primary stack, right, It's it's what I'm the most
Speaker 2: familiar with. It's where I have the most experience. And
Speaker 2: if I can just continue to bend on that, man,
Speaker 2: I'm roman are you doing testing?
Speaker 1: Are you doing tests, different development or anything along those lines.
Speaker 2: Not yet. Like I said, I think this project has
Speaker 2: been too little to bleeding edge. Right. The iterations are
Speaker 2: pretty quick, which is good, but right, TDD is something
Speaker 2: you need to practice at you you need time to do.
Speaker 1: Yeah, I could really speak to that right now my
Speaker 1: current project. You know, I haven't done a lot of
Speaker 1: testing before, but they really want to do a lot
Speaker 1: for this and it's just I'm just finding that, you know,
Speaker 1: it takes me three four times as much time writing
Speaker 1: all the tests to get the code coverage and all
Speaker 1: the different things written, unit tests, integration tests, functional tests.
Speaker 1: You know, three or four times I'll spend a day
Speaker 1: working on the code and then three or four days
Speaker 1: working on the test for that code. It's like, man,
Speaker 1: that's a lot overhead, you know, so if you well
Speaker 1: make sure.
Speaker 2: Over time, it's worth it. Right, as long as they're
Speaker 2: good tests, they're not brittle, right, and you're actually you know,
Speaker 2: running them and using some kind of right continuous integration,
Speaker 2: they're absolutely viable, especially the larger application gets.
Speaker 1: Yeah, I'm learning. I'm learning brand new patterns, you know,
Speaker 1: for writing code to make things that are testable, because
Speaker 1: you know, before in my code, I guess a lot
Speaker 1: of thing was probably a little too tightly coupled and
Speaker 1: I couldn't break it out and separate it to be tested.
Speaker 1: And you can't do that if you want to have
Speaker 1: good tests.
Speaker 2: Nope, Nope, you cannot.
Speaker 1: We're using the mock you framework and we're also using
Speaker 1: auto fixture with x units. So these are all new
Speaker 1: technologies that I haven't used it before. So it's it's interesting,
Speaker 1: but it's just it's right now. It's slow, you know,
Speaker 1: trying to figure out how that's done well.
Speaker 2: From the sound of you picked all good ones. I've
Speaker 2: used all those before as well. For instance, you know,
Speaker 2: and you it over ex Unit and in you it
Speaker 2: is great. But for for my needs and for the
Speaker 2: way I was testing and building things out, ex Unit
Speaker 2: was a better fit. So well, I think if you're good,
Speaker 2: we'll wrap up for day. We'll make this a short one,
Speaker 2: but we'll be back. Guys. Right, we're not going anywhere.
Speaker 1: Yeah, we're not going anywhere. It's almost the holiday season.
Speaker 1: But we got some guests lined up, so stays tuned. Yep.
Speaker 1: Do you want to do picks? I can do it
Speaker 1: a quick pick. Okay, I think I'm going to pick
Speaker 1: drive in movie theaters. I remember they were. They were
Speaker 1: very common when I was a kid. My mom used
Speaker 1: to take me and my brother's out to them, things
Speaker 1: like that. You know. I also remember being a real
Speaker 1: little kid and some friends wanted to go to movies,
Speaker 1: and you know, they'd throw me down on the floor
Speaker 1: of the car and put a blanket over me so
Speaker 1: they don't have to pay for.
Speaker 2: Me to get in. Oh yeah, so.
Speaker 1: That kind of thing. But you know, it's it's a
Speaker 1: way to be social existence in these times and get
Speaker 1: out of the house. And watch something entertaining and still
Speaker 1: be safe, so good in movie theaters.
Speaker 2: Or my pick perfect, Well, my pick is run in
Speaker 2: line with what I've been talking about related for work.
Speaker 2: Then let me pick out my own PC as long
Speaker 2: as it was under two thousand dollars, and I ended
Speaker 2: up getting the HP Specter X three sixty and man,
Speaker 2: this thing is sweet and the display is ridiculous, so nice. Nice.
Speaker 1: I've got two Lenovos and one Dell laptop. Actually have
Speaker 1: three Lenovo's, one personal ones for my company that I
Speaker 1: work for, the other ones for a company that I'm
Speaker 1: working on a project that they got to have you know,
Speaker 1: security and things like that, so it's its own laptop.
Speaker 1: And then I have a a Dell for another project
Speaker 1: they're working on. So I've got two desktops and four
Speaker 1: laptops and they're all kind of they're all good. I've
Speaker 1: always had good luck with Lenovos, so those are good.
Speaker 1: But the Dell that I'm working on has been working
Speaker 1: just fine well as well. My desktop. I got an
Speaker 1: Alien War PC, so it's really souped up and ready,
Speaker 1: and I've got a VR headset on order, so now
Speaker 1: trying out some of that stuff.
Speaker 2: So well, you can never have too many PCs. That's right.
Speaker 1: Don't tell my WF.
Speaker 2: Okay, I'll keep it between us, all right, all right, Sean,
Speaker 2: thanks Cab, Yeah, thank you, and we'll see y'all later.
Speaker 1: Yep. If you want to reach out to show you
Speaker 1: want to get in touch with me, get me on
Speaker 1: Twitter at dot net superhero. All right, thanks guys, we'll
Speaker 1: catch everybody on the next episode of Adventures in dot Net.