Pluralsight - kurs: Building an Enterprise App with WPF, MVVM, and Entity Framework Code First

0

Próbuję wzbogadzić swoją wiedzę o EntityFrame ze szczególnym jego wykorzystaniem w WPF MVVM. Na pluralsight znalazłem taki kurs:

Building an Enterprise App with WPF, MVVM, and Entity Framework Code First.

Nie wiem czy ktoś ma do niego dostęp I mógłby mi wyjaśnić jedną rzecz, ponieważ dostaje błąd którego nie do końca rozumiem, a jestem prawie pewien, ze mam wszystko dokładnie tak samo jak w kursie.

Sprawa sprowadza się do tego.
W App.xml.cs
Jest zrobiony even który odpali nam główne okno.

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            var mainWindow = new MainWindow()
                new MainViewModel(
                    new FriendDataService()));
        }

Konstruktor głównego okna wygląda następująco:

        public MainWindow(MainViewModel viewModel)
        {
            InitializeComponent();
            _viewModel = viewModel;
            DataContext = viewModel;
            Loaded += MainWindow_Loaded;
        }

Konstruktor ViewModelu wygląda tak:

        public MainViewModel(IFriendDataService friendDataService)
        {
            _friendDataService = friendDataService;
        }

Błąd który dostaje:

Error	2	Argument 1: cannot convert from 'FriendOrganizer.UI.Data.FriendDataService' to 'FriendOrganizer.UI.Data.IFriendDataService'	

I błąd wydaje mi się, ze rozumiem, konstruktor ViewModelu przyjmuje argument Interfaceale w evencie jest tam wstawiana klasa.

Jedyną rzecza którą nie mogłem zrobić dokłądnie tak jak w kursie jest extract interface , mam VS 2013 express i tego tam podobno nie ma. Więc co zrobiłem stworzyłem sobie wszystko tak jak ta osoba ma w projekcie:

    public class FriendDataService
    {
        public IEnumerable<Friend> GetAll()
        {
            //TODO: Load data from real Server
            yield return new Friend { FirstName = "Tomek", LastName = "Lis" };
            yield return new Friend { FirstName = "Norbert", LastName = "Skarus" };
            yield return new Friend { FirstName = "Michał", LastName = "Świniarski" };
            yield return new Friend { FirstName = "Jeremiasz", LastName = "Zielonkiewicz" };
            yield return new Friend { FirstName = "Adam", LastName = "Stelmaszuk" };
        }
    }

W kursie jak pojawił się ta cześć kodu, osoba prowadząca wyekstraktowała interface z FriendDataService. Tak jak wspomniałem ja takiej opcji nie mam więc zrobiłem dokłądnie taki interface jak on prezentował:

    public interface IFriendDataService
    {
        IEnumerable<Friend> GetAll();
    }

Nie mniej może, extractując Interface dzieje się coś w tle czego ja nie widzę, co powoduje mój błąd.

Mam nadzieję, że dokładnie opisałem mój problem.
Będę wdzięczny za pomoc.

1

FriendDataService powinien implementować IFriendDataService

public class FriendDataService : IFriendDataService
    {
        public IEnumerable<Friend> GetAll()
        {
            //TODO: Load data from real Server
            yield return new Friend { FirstName = "Tomek", LastName = "Lis" };
            yield return new Friend { FirstName = "Norbert", LastName = "Skarus" };
            yield return new Friend { FirstName = "Michał", LastName = "Świniarski" };
            yield return new Friend { FirstName = "Jeremiasz", LastName = "Zielonkiewicz" };
            yield return new Friend { FirstName = "Adam", LastName = "Stelmaszuk" };
        }
    }

I przy takim zapisie możesz zrobić tak: IFiriendDataService friendDataService=new FriendDataService();

0

Zadziałało. Dziękuję.

0

Nie wiem czy ktoś jest zaznajomiony z implementacja MVVM z EF przedstawioną w tym kursie ale chciałbym zapytać czy rzeczywiście jest to tak robione na porządku dziennych w "prawdziwych projektach"?

Na początku myślałem, że rozumiem podstawowy koncept MVVM, ale jego implementacja w kursie jest dla mnie bardzo zagmatwana i mało zrozumiała. Czy to jest tak, że benyfity takiego podejścia można zrozumieć tylko w dużych projektach gdzie jest wielu deweloperów? W moiej obecnej pracy każdy projekt robi jedna osoba, od początku do końca. Poczynając od rozmową z biznesem, planowaniem architektury, kodowanie, stawainie bazy etc.

Czy na podstawie samego takiego kursu można zrozumieć po co to wszystko? Jaki jest ogólny cel i benefity takiego podejście? Mogę śledzić, słuchać i robić u siebie to co dzieje się w tutorialu ale czuje, że na razie jest to takie przeklepywanie z małym zrozumieniem.

1

A to nie jest czasem tak, że masz problem ze zrozumieniem różnych konstrukcji z powodu braków w języku, interfejsy itp?

0

Na pewno jest to częścią problemu. Obecnie nie musze korzystać z Interface, Wszystko co robię na razie działa, odbiorca jest zadowolony z samego czytania/kursów ciężko mi wyciągnąć benyfit i rzeczywiste zastosowanie Interface.

Teraz przy tym kursie na pewno odciska to swoje piętno. Nie mniej chce się jakoś rozwijać, ale może z drugiej strony ten kurs jest ciut za bardzo zaawansowany, z mentorem który może mi byłby w stanie mi to bardziej wyjasnić byłoby łątwiej, niestety takiego luksusu nie posiadam.

Obecnie mam kolejny problem. W kurse w pewnym momencie jest taka część kodu:

    public class MainViewModel : ViewModelBase
    {

        public MainViewModel(INavigationViewModel navigationViewModel)
        {
            NavigationViewModel = navigationViewModel;
        }

        public async Task LoadAsync()
        {
            await NavigationViewModel.LoadAsync();
        }
        
        public INavigationViewModel NavigationViewModel { get; }

    }

Błedy mam dwa:

Error	1	'FriendOrganizer.UI.ViewModel.MainViewModel.NavigationViewModel.get' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.	
Error	2	Property or indexer 'FriendOrganizer.UI.ViewModel.MainViewModel.NavigationViewModel' cannot be assigned to  it is read only		

Error 2 wydaje mi się dość jasny. Definiuje sobie NavigationViewModel tylko z get a w konstruktorze probuje mu przypisać wartość. Zakładan, więc że błąd jest w innym miejscu.
Error 1 tutaj nie bardzo rozumiem. Mój interface jest zaimplementowany:

    public interface INavigationViewModel
    {
        Task LoadAsync();
    }

I z ostatniego posta wiem, że klasa z której ten interface wyekstraktuje musi po nim dziedziczyć i wygląda tak:

    public class NavigationViewModel : INavigationViewModel
    {
        private IFriendLookupDataService _friendLookupService;

        public NavigationViewModel(IFriendLookupDataService friendLookupService)
        {
            _friendLookupService = friendLookupService;
            Friends = new ObservableCollection<LookupItem>();
        }

        public async Task LoadAsync()
        {
            var lookup = await _friendLookupService.GetFriendLookupAsync();
            Friends.Clear();
            foreach(var item in lookup)
            {
                Friends.Add(item);
            }
        }


        public ObservableCollection<LookupItem> Friends { get; set; }
    }
0

public INavigationViewModel NavigationViewModel { get; private set; }

Masz wyraźnie napisane co jest nie tak.
Inna opcja to:
private INavigationViewModel _navigationViewModel;
public INavigationViewModel NavigationViewModel { get { return _navigationViewModel; } }

0

Po dodaniu Po dodaniu private set; Rozwiązał się jeden error niestety drugi pozostaje:

Error	1	'FriendOrganizer.UI.ViewModel.MainViewModel.NavigationViewModel.get' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors. 

Nie mniej, to z private set; rozumiem ale w prezentacji czegoś takiego nie ma.
Jest dokładnie tak jak w snipie który przekleiłem i tam to działa, błędów nie ma. Próbuje zrozumieć tą różnicę. Czy coś innego w tle się dzieje, czy gdzieś jakaś definicja jest inna?

0

To że w prezentacji nie ma to znacz, że raczej czegoś nie zrobiłeś. Pokaż jeszcze klase bazową

0

Powiem szczerze, że na pierwszy rzut oka strasznie przekombinowane rzeczy tutaj się dzieją. Da się to zrobić dużo prościej za pomocą jakiegoś frameworka MVVM np. Prisma. Ręczne przypinanie viewmodelu jaka DataContext w sytuacji kiedy w ogóle nie trzeba tego robić? C'mon! EDIT: dobra, tutaj zauważyłem, że jednak trzeba było, więc cofam to :-)

Jak znajdę chwilkę to wystawię mały projekt MVVM z oddzielnym projektem z modelem danych gdzie wszystko jest dużo prostsze.

PS: to, że czegoś nie było w prezentacji albo, że coś było, a nie skorzystałeś to jeszcze nie oznacza, że źle zrobiłeś.

0

Dziękję bardzo.
Nie wiem co się stało, ale zacząłem robić ten moduł w szkoleniu od początku i już działa. Chociaż tam ten set; muszę wstawiać, pomimo że w szkoleniu nie ma.

Będę wdzięczny za taki projekt plus może masz polecić jakiś kurs internetowy taki z łatwiejszą implementacją MVVM?

Mój pomysł na to wziął się bo „myślałem”, że znam i używam jakiejś wariacji na temat MVVM teraz (chociaż używąłem do tej pory TableAdapterów – co podobno jest już zapomnianą technologią nie stosowaną przez nikogo), ale przez chęć rozwoju postanowiłęm ruszyć ten EntityFramework.

Na forum wszędzie mówią, że nie ma sensu iść na kursy stacjonarne bo to dużo kosztuje i mało jest to aplikowalne do prawdziwego biznesu (przynajmniej z takimi opiniami się spotkałem). Za to wszyscy mówią, że każdy informatyk musi się rozwijać sam na internecie czytając dokumentację i robiąc kursy. Siadam wieć do takowego i jestem prawie zabity poziomem skomplikowania. Potem ktoś @grzesiek51114, mówi, że to rzeczywiście jest mega zakręcone i tak się „nie robi” (cyt. „C’mon!”) ... skołowanie odbiera chęć do czegokolwiek.

0
grzesiek51114 napisał(a):

Powiem szczerze, że na pierwszy rzut oka strasznie przekombinowane rzeczy tutaj się dzieją.

Pewnie masz racje. Ale jak on nie rozumie interfejsów i pewnie jeszcze kilku innych rzeczy to myślę, że powoli może przebrnąć przez to. Ale spokojnie ze zrozumieniem. Może też tak być,, że na początku jest trochę kupa a potem prowadzący zrobi jakiś refactor, który uprości pewne rzeczy. Nie znam się zbytnio na MVVM i WPF ale z doświadczenia java script to powiem że lepiej poznać podstawy solidne czystego js a potem brać się za frameworki.

1

Dobra, tak na szybko:

  • do poczytania do czego służy Prism oraz Event aggregator; Bez takich rzeczy programowanie za pomocą MVVM często będzie sprowadzać się do wykorzystywania magii, a jak będziesz miał za mało many to polegniesz. Podobne rzeczy znajdują się w każdym, lepszym frameworku MVVM vide MVVM Light etc...
  • bazę danych symuluje kolekcja wewnątrz modelu;
  • masz tutaj tabelkę i możliwość edycji i dodania nowego wiersza z wykorzystaniem podstawowych mechanizmów Prism.
  • kod jest jako tako obkomentowany, najwięcej MainWindowViewModel, bo tam się najwięcej dzieje. Nie miałem czasu na wszystko.

Jakby coś to pytaj. Wracam do roboty ;)

PS do tych co się znają: pisane na szybko ale emwiwiemowo jest wszytko ładnie działające.
PS: książki raczej nie polecę żadnej, bo to co jest w załączniku to moja idea projektu, w sumie dojrzewająca przez lata i opracowana na podstawie przeróżnych dokumentacji i sugestii różnych osób, również z tego forum.

@Norbert_S: Gorąco polecam Prism Template Pack do Visuala.

0

Oczywiście zapomniałem code-behind widoków zrobić:

Unloaded += (sender, e) => vm.Unsubscribe();

W celu desubskrybowania eventów Prisma przez zamykane okno.

0

Jeśli chodzi o ten kurs to sam go kiedyś przerabiałem i z tego co pamiętam był całkiem w porządku.

0

@cSharpKazik: jak tak patrzę na fragmenty kodów to one wcale nie są takie złe. Przeraziło mnie np. tak wielokrotne yeldowanie. :) w ogóle WFP'iarzom od początku było trochę pod górkę, bo MS nie faworyzował jednego rozwiązania, tak jak w swoim ASP.NET MVC i każdy robił jak chciał. Z jednej strony do dobrze, bo MVVM to jedynie wzorzec architektoniczny i można go przecież zaimplementować po swojemu. Z drugiej strony brakowało takiego lidera jakim w MVC był na początku np. Razor. Z większych frameworków chyba najbardziej liczą się Prism i MVVM Light ale ten drugi już chyba nawet nie ma strony (albo mają awarię). Prism jest aktywnie rozwijany cały czas i naprawdę ladnie się sprawdza. Są gotowe templatki do UWP, do Xamarina, do WPFa... Chyba nawet sam MS wspiera ten projekt, a ja mu osobiście kibicuję, bo ten framework rozwiazał dobre 70% problemów przy MVVM.

0

Jedyne co mogę powiedzieć to gratuluje i chyba na początek ten kurs jest dla mnie zbyt ciężki.

To co mogę z waszych wypowiedzi wyciągnąć to na razie darować sobie ten kurs, wrócić jak napiorę więcej doświadczenie i zrozumienia. Zamiast tego spróbować swoich sił z PRISMem?

Tak czy siak dziękuję wam za wszystkie rady :).

0

Zamiast tego spróbować swoich sił z PRISMem?

Nie pożałujesz. Dla mnie osobiście bez dobrego frameworka nie ma MVVM, a Prism jest naprawdę dobrym narzędziem:
Tutaj pisałem o różnych ficzerach samego Prisma - pkt. 6

Ja już bez tego apek w WPF'ie nie piszę, bo to byłby masochizm. ;)

0

Jeżeli chodzi o Thomasa Claudiusa Hubera polecam też Jego wcześniejsze kursy:
https://app.pluralsight.com/library/courses/wpf-mvvm-advanced-model-treatment/table-of-contents
i
https://app.pluralsight.com/library/courses/wpf-mvvm-test-driven-development-viewmodels/table-of-contents

U nas w teamie rozmawiając o WPFie często dla żartu używaliśmy niemieckiego akcentu ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1