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?
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ę.
Przecież masz WPF w netcore 3
@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
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?
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.
@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
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
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.