Aplikacje WPF - Czy da się wykorzystać funkcjonalności dostępne w aplikacjach NET Core

0

Witam. Bardzo spodobało mi się narzędzie EF Core, całe te migracje itp. Jestem z tym zaznajomiony w stopniu podstawowym.
Czy w aplikacjach WPF jest możliwość wstrzykiwania klas / serwisów ?
Czy można tworzyć w aplikacjach WPF kontekst bazy danych będący chociaż podobny w użyciu co EF Core?

2

Domyślnie WPF nie ma takiego kontenera IoC jak np. ASP.NET Core, ale nic nie stoi na przeszkodzie, żeby sobie taki dodać. Można też korzystać z EF Core bez kontenera.

Dawno nie robiłem w WPF, ale z tego co pamiętam, możesz zautomatyzować ładowanie DataContextu kontrolek (np. ViewModeli i dalszego drzewa zależności) ze statycznego kontenera, z tym że wymagałoby czegoś na kształt własnej nawigacji, i ustawiania DataContextu zanim podmienisz część widoku, używając bodajże ContentControl.

Możesz też użyć biblioteki takiej jak Prism, która zrobi to za Ciebie i ułatwia dodanie IoC. Dodatkowo wprowadza własne haki, m.in. system eventów, nawigację.

2

Przecież masz WPF w netcore 3

0

@Ktos @kzkzg @mr-owl sprawdziłem przykład ze strony microsoft. EF Core w WPF App działa naprawdę fajnie mimo, że serwisy w WebApp wydawały się bardziej dla mnie przyjazne chociażby przez prostotę implementacji.

Web App
screenshot-20201204211112.png

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IRoomService _roomService;
        private readonly SignInManager<ApplicationUser> _signInManager;
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly RoleManager<IdentityRole> _roleManager;

        public HomeController(ILogger<HomeController> logger,
            IRoomService roomService,
            SignInManager<ApplicationUser> signInManager,
            UserManager<ApplicationUser> userManager,
            RoleManager<IdentityRole> roleManager)
        {
            _logger = logger;
            _signInManager = signInManager;
            _roomService = roomService;
            _userManager = userManager;
            _roleManager = roleManager;
        }

To po prostu mnie wyrwało z butów, że nie mogłem wstać jak zobaczyłem jakie to jest banalne. W WPF to wygląda nieco inaczej:

private readonly ProductContext _context = new ProductContext();
private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
            _context.Database.EnsureCreated();
            _context.Categories.Load();
            categoryViewSource.Source = _context.Categories.Local.ToObservableCollection();
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            _context.Dispose();
            base.OnClosing(e);
        }

Ten kod z WPF nasuwa mi wiele pytań m.in. co się stanie jak będę potrzebował wykonać operacje na bazie danych w kontrolkach WPF umieszczonych w oddzielnej dllce...

I teraz kolejna myśl:
Chyba 4 lata temu ktoś mnie w którymś poście namawiał do PRISMA kiedy @_13th_Dragon wydostał mnie z czeluści czystego WinAPI i namówił na WPF. Teraz doczytałem, że Prism umożliwia wstrzykiwanie zależności,** więc chyba możliwe jest zbudowanie takiego serwisu jak w WebApplication korzystającego z bazy danych?**
https://www.thecodebuzz.com/entity-framework-wpf-windows-presentation-foundation/
Chyba jestem na dobrej drodze?

3

IMO mieszasz sobie dwie rzeczy:

Fakt, że możesz sobie zrobić HomeController(ICośtam obiekt) i ci go wstrzyknie - to DI (Dependency Injection - wstrzykiwanie zależności). Gdzie że to działa "automatycznie" w ASP.NET Core wynika z Microsoft.Extensions.DependencyInjection.

Fakt, że możesz powiedzieć dbContext.Obiekty.Where(x => x.IsPies) i ci połączy się z bazą danych i da listę psów - to ORM (mapowanie relacyjno-obiektowe), gdzie konkretnie to może być EF Core, ale nie musi.

Tak, możesz w WPF-ie użyć np. Prisma (albo MVVMLight albo pewnie czegoś jeszcze czego teraz nie pamiętam - albo może nawet i Microsoft.Extensions.DependencyInjection - nie testowałem) i robić aby ci się samo wstrzykiwało do ViewModeli/serwisów czy gdziekolwiek klasy których potrzebujesz - np. konteksty z EFCore.

1

@Grzegorz Świdwa: Ale dlaczego nie używasz Event Aggregator? Jak dla mnie to fajniejsze połączenie pomiędzy ViewModels a usługami?

Pozdrawiam,

mr-owl

0

Przepraszam za całe zamieszanie. Po tym jak rozpocząłem pisanie aplikacji w WPF PRISM zdałem sobie sprawę, że próbuję powielić operacje wykonywane na bazie danych z tymi które już wykonuje moja aplikacja internetowa NET CORE. Wpadłem na pomysł, że owa aplikacja będzie udostępniała API, a moja aplikacja WPF będzie pobierała z niego dane a nie bezpośrednio z bazy. Bez sensu klepać ten sam kod dwa razy. Tak czy siak mam kolejny krok do przodu jeżeli chodzi o WPF więc bardzo Wam dziękuję :)

@mr-owl potrzebuję czasu na ogarnięcie do kupy wszystkich materiałów z internetu :) ten PRISM będzie fajny jak pozbędę się wszystkich wyskakujących wyjątków pełzających w pierwszej aplikacji ;D

1

Jak czytałem, wielu ludzi unika frameworków typu PRISM, ponieważ jest on źródłem wielu bugów. Jeśli chcesz szybko coś napisać to jest spoko. A jeśli chcesz się nauczyć WPF i zrozumieć jak działa wszystko pod maską PRISM, to polecam poczytać o:

  • MVVM,
  • ICommand,
  • Bootstrapper,
  • ViewModelBase,
  • sposobach tworzenia kontekstu VM dla widoków.

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