The Most Wonderful Type of Tests
18:30
Why SingletonSean?
5:39
9 ай бұрын
You Might Not Need That Interface
7:58
Пікірлер
@NoScrewsLoose
@NoScrewsLoose Сағат бұрын
A guy on Upwork made an app for me using this design pattern. I have to make updates and trying to figure out how it works. With events, at least you know where to look to see what a button does. This design pattern seems cool, but good luck trying to figure out how anything works if someone else made it
@jeremiedupont8696
@jeremiedupont8696 10 сағат бұрын
Really awesome tutorial! Thank you! I had to make a dynamic screen with controls based on the datatype of the parameters... Your technique worked like a charm. Thank you!
@avalanczy
@avalanczy Күн бұрын
Getting a "can't put a window in a style" error on the <view: View/> lines in the mainwindow.xaml ?
@andrerippstein4702
@andrerippstein4702 2 күн бұрын
The method you showed in the video seems not to work on Android using .NET Core 8.0. When I initialize Serilog as you showed, no log file is created and nothing is logged. using Microsoft.Extensions.Logging; using Serilog; namespace MauiApp2 { public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); // This seems not to work on Android using .NET Core 8.0 builder.Services.AddSerilog(new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.FromLogContext() .WriteTo.Debug() .WriteTo.File(path: Path.Combine(FileSystem.Current.AppDataDirectory, "logs", "AppLog-.log"), rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, retainedFileCountLimit: 31) .CreateLogger()); return builder.Build(); } } } However, the following initialization works on Android using .NET Core 8.0: using Microsoft.Extensions.Logging; using Serilog; namespace MauiApp2 { public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); // This works on Android using .NET Core 8.0 Log.Logger = new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.FromLogContext() .WriteTo.Debug() .WriteTo.File(path: Path.Combine(FileSystem.Current.AppDataDirectory, "logs", "AppLog-.log"), rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, retainedFileCountLimit: 31) .CreateLogger(); builder.Services.AddSerilog(Log.Logger); return builder.Build(); } } }
@nathannathan263
@nathannathan263 7 күн бұрын
great tutorial but the naming scheme gives me headache
@MegaKenniK
@MegaKenniK 7 күн бұрын
one word, awesome.
@nasermustafi9828
@nasermustafi9828 8 күн бұрын
you could just not talk about steps you take, instead of skipping them. Sorry to say but even if you watch yourself your own video, you'll find it frustrating.
@John-b7b2q
@John-b7b2q 8 күн бұрын
I just have a suggestion to set "Follow Active Document in Solution Explorer" config setting to true so when you change tabs we can see where the file is located in the solution. It might be helpful for some viewers like myself. Great video.
@geekomania6471
@geekomania6471 10 күн бұрын
Comme de nombreux commentaires l'ont dit,chatgpt utilise uniquement le dataset fournit par OpenAI,qui ne peut être amélioré que par ses équipes.Ce qui est retenu dans les conversations ce n'est que la forme et pas le contenu,OpenAI suit des clauses de confidentialité pour assurer celle de ses utilisateurs.
@buraktoglu
@buraktoglu 10 күн бұрын
nice work bud, keep it goin' kıps
@jannickbreunis
@jannickbreunis 10 күн бұрын
Alot of videos explain the factory for deciding which type of object to instantiate. This one also shows how to handle dependencies. This is a must use when using a DI container, making it very easy to add a service to the factory (injected with DI container) which will be communicated to the service. Hope that makes sense... Thanks for the video.
@TuberTugger
@TuberTugger 20 күн бұрын
Get ready for everyone's pc to flag your app as a virus
@BrensNina
@BrensNina 21 күн бұрын
4:43 If you don't put some parameter or logic for the creation of the instance the lambda expression is innecesary I think (newbie here :p) services.AddTransient<PeopleListingViewModel>(s => new PeopleListingViewModel());
@AzenisBm
@AzenisBm 21 күн бұрын
Thanks for the great tutorial
@peterbutler5256
@peterbutler5256 21 күн бұрын
is there a way to download your code?
@OneMassiveMan
@OneMassiveMan 22 күн бұрын
Use react native with expo. Maui is terrible with memory leaks everwhere with complex layouts, your apps will just crash without reasons. Memory leaks embedded within MAUI, MS doesn't even use MAUI on their OWN FLAGSHIP products as they are not possible in .net MAUI. MS will cancel and abandon it. Migrate all apps to react native with expo as that is the future. Better tooling, easier to use, no memory leaks, can customize everything, way faster.
@mikehankey8666
@mikehankey8666 22 күн бұрын
Your series of videos is very good, thanks for the effort!
@MichaelBrownPlus
@MichaelBrownPlus 24 күн бұрын
Not anymore. .Net 9 MAUI updates have been very stable and even better .Net ASPIRE as my backend helper framework in Azure has made my experience much better. I can build all my APIs, using Google Firebase for Auth (front end and backend to Azure), using SyncFusion UI, I’ve been able to build amazing apps. Even one I’m now about to publish using PLAID. I’ve been able to still continue (as I have with Xamarin) building both Android and iOS apps pretty damn easy and bug free. With very scalable Azure app services, SQL server, message queuing, storage, and security through managed identities and OAuth. I think if you really know the framework you’re fine. Easy to work through the quirks.
@josersleal
@josersleal 26 күн бұрын
simple: MS user RN
@5ROC
@5ROC 27 күн бұрын
Excellent !
@zajac4817
@zajac4817 29 күн бұрын
This is pure GOLD!
@mikehankey8666
@mikehankey8666 Ай бұрын
Very helpful series, great job!
@ConfidentiaX
@ConfidentiaX Ай бұрын
@SingletonSean What differences would I run into if I used, for example, Supabase instead of Firebase? Are there any large differences between them?
@miguelvega7168
@miguelvega7168 Ай бұрын
Awesome video!
@Manicmany
@Manicmany Ай бұрын
---------------_-_-_-_-_---------- What is in program.cs show that page
@seiyonlee3044
@seiyonlee3044 Ай бұрын
How you doing man? last video seems quite outdated. any good, it would be great if I get your new video!
@RamasamyN-o5p
@RamasamyN-o5p Ай бұрын
I am currently building a .NET MAUI Hybrid app. It's amazing.
@JohnGrove310
@JohnGrove310 Ай бұрын
Thanks, good stuff
@ДмитроГоголенко
@ДмитроГоголенко Ай бұрын
I deleted StartUpUri and now styles are not applied. How to fix this?
@racha8683
@racha8683 Ай бұрын
Well explained to someone who is good at c#, but for someone who is learning, this is just too fast, I know you are good at your work, but you aren't proving me how fast you can do it, you are literally teaching me something.
@denes.trambola
@denes.trambola 2 күн бұрын
if you are learning MVVM when you're not good at C# rn, then sorry, but you are in the wrong place, my friend. First, understand C# to at least an intermediate level, then start to study the simple WPF concepts, elements, interfaces, classes, small project implementations, etc., and after that, you can start to think about the architecture patterns like MVVM (and maybe after MVVM, you can start to learn the larger architecture patterns like Domain Driven Design which is a very big game changer in C# projects, especially in big companies where they like the structured and well-designed projects). I hope I could help you!
@prakash2187
@prakash2187 Ай бұрын
I am impressed by the way you think and just code it , how can i become pro like you ? :)
@marvinalone
@marvinalone Ай бұрын
why do you re-create the view models again and again?
@milicaiv8879
@milicaiv8879 Ай бұрын
Hi Sean, I watched your videos on using Strawberry Shake with GraphQL and found it really helpful! I have a quick question: How can I access response headers with Strawberry Shake? Is there a specific configuration or approach to intercept them? I’d really appreciate any guidance :)
@jwalsoni5458
@jwalsoni5458 Ай бұрын
Man, you are going too fast
@klubkofta
@klubkofta Ай бұрын
Perfect, thank you!
@gregorymoore2877
@gregorymoore2877 Ай бұрын
Nice video! Would you like an easy way to find your actual database after the app creates it? I print the complete file path to the console. From there, I copy/paste the path into my file browser. I recommend using a Sqlite editor such as Navicat For Sqlite or JetBrains DataGrip to open and examine your database so you can verify that the app is doing what is expected.
@PrashantKumarSharma
@PrashantKumarSharma Ай бұрын
Making my notes in the comment section: ViewModals used: 1. KZbinViewersDetailsViewModel : The right pane 2. KZbinViewersListingViewModel : The whole list in the left pane 3. KZbinViewersListingItemViewModel : It is each tab in list (left pane) consisting of username and commands under 3 dots 4. KZbinViewersViewModel : where above 3 VMs are instantiated
@PrashantKumarSharma
@PrashantKumarSharma Ай бұрын
1. KZbinViewer : RO(Modal) Class with 3 fields - 1) username 2) bool value 3 ) bool value 2. KZbinViewStore : Cache of selected item in list which is updated every time item is selected via viewModel class interactions
@PrashantKumarSharma
@PrashantKumarSharma Ай бұрын
Flow : KZbinViewersViewModel will have the RO/ Modal object with which it updates the Selected Store and it is used to display to other places
@PrashantKumarSharma
@PrashantKumarSharma 25 күн бұрын
ViewModels for Modal : 3 added KZbinViewersDetailsFormViewModel : It takes care of the right pane which has a form like structure. The Properties are : 1. UserName 2. IsSubscribed 3. Submit Command 4. Cancel Command The above ViewModel is used in AddKZbinViewersViewMode and EditKZbinViewersViewModel Navigation Store: ModalNavigation store has CurrentViewModel(inheriting from ViewModelBase) which holds the current viewmodel on display
@PrashantKumarSharma
@PrashantKumarSharma 25 күн бұрын
Navigation: In order to open AddKZbinViewers and EditKZbinViewers dialog boxes we have created another store "ModalNavigationStore" and it will store which among the above two it will hold in the CurrentViewModel variable ( of ViewModelBase class) We will create a MainViewModel class which will hold the ModelNavigationStore variable and KZbinViewersViewModel variable. After this you can set ModelNavigationStore variable to either Add or Edit window in order to set the currentViewModel window on top of the Viewers list
@PrashantKumarSharma
@PrashantKumarSharma 19 күн бұрын
Basic Commands : ADD button command is added in the KZbinViewersViewModel where all the 3 MVVs are instantiated A command folder is added and we will crat class command files - Every command is implemented with CommandBase class - CommandBase is implemented with ICommand - AddCommand has modalNavigationStore object passed holding the current viewmodel as it opens a Adding Dialog box - CloseCommand - even though we pass modal navigation store, we make CurrentViewModel as .Close()/null to close the dialog box - EditCommand
@claudio1983
@claudio1983 Ай бұрын
I'm just starting to discover MAUI. So I'm not an expert, but it seemes good to me. Not so bugged as portraied. Generally if you follow the guide lines it works well... bugs are everywhere on any framework. What I think is good of MAUI is the intention to be wide spread usable. I think MAUI is just at the beginning, like the .NET framework itself initially wasn't so good, and then it spread everywhere. And xaml is a very good feature since you can take almost any previous application and keep the UI (like from WPF for example). The fact is that the platform zoo is so vast and various, so give them some time. I'm confident it will be good.
@Taril69
@Taril69 Ай бұрын
Man i didnt work for me..I did every step. I dont get any value into the variabel(key). creaed json file -> created AddAppsettings method -> downloaded 2x nugets (Bind & Json) -> changed propertie of json file. builder.AddAppSettings(); string key = builder.Configuration.GetValue<string>("ID_KEY"); private static void AddAppSettings(this MauiAppBuilder builder) { using Stream stream = Assembly .GetExecutingAssembly() .GetManifestResourceStream("VerifyIdentityProject.appsettings.json"); if(stream != null) { IConfigurationRoot config = new ConfigurationBuilder() .AddJsonStream(stream) .Build(); builder.Configuration.AddConfiguration(config); } }
@tonyelchino1
@tonyelchino1 Ай бұрын
Code snippets that are already part of visual studio only require one tab button press, however the custom snippets require two. Is there anyone way to change that behavior and only require that my custom snippet needs one tab button press?
@jacoby6000
@jacoby6000 Ай бұрын
Not sure if you still watch these comments, but I hope you do :D I'm very confused about what benefit this provides. It seems like you're adding a lot of boilerplate to solve something that was never a problem. I see IoC containers and ServiceProvider patterns being considered best-practices in several domains, but every time I've ever wrestled with a system that uses them it just feels like an exercise in frustration. When things are not done perfectly, you get opaque errors. When things are done right, you have a bunch of indirect references to global shared state which makes the tracking down problems more difficult. I've heard people say they help with testing, but I've never seen a convincing argument for it. How is this better than just using normal constructors and passing around references?
@axeburningfire2507
@axeburningfire2507 Ай бұрын
Singleton Sean, my man. I will appear to you in your moment of greatest peril to repay this debt.
@axeburningfire2507
@axeburningfire2507 2 ай бұрын
Thank you Sean, very based.
@MarcusDambacher
@MarcusDambacher 2 ай бұрын
Hi Sean, I have devoured all your playlists on WPF. I'm a regular subscriber and find your videos really great. I have learned a lot about the MVVM model and your instructions are very practical. With the ParameterNavigationService feature, however, I fail at the implementation via DependencyInjection. You only implemented this in another installment of this series, but unfortunately no longer have an example in your application on GitHub. You have created an example for iancarr3923 that shows the normal implementation, but I always fail to pass the parameter via DependencyInjection. Since I would like to use the feature in a current project, I would be very grateful for a tip. Otherwise I can only encourage you: Keep up the good work.
@LeahTaylor-s8e
@LeahTaylor-s8e 2 ай бұрын
Great videos, but man you go fast. I usually watch videos at 1.25 or 1.5x, but you're the first person who seems too fast for me even at normal speed! Great content though, very helpful.
@katkatkatomg
@katkatkatomg 2 ай бұрын
great video & tutorial!! small note for 2024: the [Service] attribute isn't necessary and in fact will break the batch loading functionality 😊
@oneheykal
@oneheykal 10 күн бұрын
Thank you!
@drancerd
@drancerd 2 ай бұрын
Now... a year after... there is hope? Blazor (Even MS use it) Aspire (Literaly You work for MS without contract) Core (Same as Aspire) MAUI: - It has no maps support - Binding libraries doesn't work - Lack of Doc and Benchmarks - No good examples and code snipets & tutorials - No Dev friendly at all The 'stuff' with MAUI, it's that customers want interconnected apps (desktop, web, Mobile & Excel obviously)
@glu_max
@glu_max 2 ай бұрын
Your videos are great, I've learned a lot about WPF. May I ask why did you make a field public (3:46)? I heard it's a bad practice. Thanks!
@JohnGrove310
@JohnGrove310 Ай бұрын
Probably just as an example. Just make it a property.
2 ай бұрын
Views are garbage collected but viewmodels must be explicitly disposed. Set all fields and events to null (especially PropertyChanged) because hidden view objects that retain mystery bindings will be your biggest source of memory leaks. And viewmodels will be hard to manage unless you give them a parent-child relationship just like the visual and logical trees. Destructors don't come into play with viewmodels because viewmodels should only be used and disposed on the Dispatcher they were created from.
@rshelfo1
@rshelfo1 2 ай бұрын
Love the series, at 10:13 how did you inspect the actual network connection made between refit and the api? Where did you get the header information from?