Új hozzászólás Aktív témák
-
CPT.Pirk
Jómunkásember
válasz joysefke #9900 üzenetére
Egy CAD program projektjéhez tartozó kiexportált szabályrendszert tartalmazó szövegfájlt dolgoz fel és jeleníti meg grafikusan. Ez az ága a programnak nem volt korábban használva, mert egy bizonyos szabály típusnál fut csak ide, ami tartalmazza a % jelet és ilyen nem volt korábban.
A 43-as sorban lévő Pop() okozza az exceptiont. [link]
Amikor odaér a kód a 42-es sorhoz a while-al miután betöltöttem a fájlt, akkor a Count() értéke 2 és benne is van két szöveg részlet a fájl első sorából a debugger szerint.
A while egyszeri lefutásával elsőre lemegy a Pop(), a Count módosul 1-re de a következő körben mégis exception jön. Akkor is, ha ott a Pop() helyett Clear() van, arra is elszáll.Azt hiszem nincs több szálasítva a program, de bővebben egyenlőre nem ismerem a működését.
Hogy ez a Stack dolog miért jó azt nem tudom, én stringlist dolgokkal szoktam szövegeket kezelni de C# alatt még nem programoztam.[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
-
CPT.Pirk
Jómunkásember
Igen, debug build optimization nélkül.
Viszont, a while ciklus a probléma forrása:while (s1.Peek() != "&&" && s1.Peek() != "||")
{
s1.Pop();
}
Úgy gondolom az történik, hogy mikor a Pop(); kiszedi az utolsó elemét a stacknek, akkor azzal megölte magát a while-t is. ?megszűnt a ciklus változó?Azért gondolom ezt, mert a "hagyományos" módon meg működik ugyanez:
int j = s1.Count();
while (j > 0)
{
if ((s1.Peek() != "&&") && (s1.Peek() != "||"))
{
s1.Pop()
}
else
break;
}
Ez így jónak tűnik. Ugyanakkor a kód további részét ebben az ágban majd át kell írnom, de az már más kérdés.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
quailstorm
nagyúr
válasz CPT.Pirk #9904 üzenetére
Igen, így van. A Peek üres stack esetén exceptiont dob. Szóval az utolsó pop után a következő feltételellenőrzés a while-ban exception, nem pedig false. A Count ellenőrzése jó lesz.
-
válasz CPT.Pirk #9904 üzenetére
A leírásod arra utalt, hogy még "látod", hogy van benne elem és úgy dob exceptiönt.
Debug buildben látnod kellett volna a ciklus fején a feltétel ellenőrzése előtt hogy üres a stack -kurzort fölé viszed-.Ha az a baj, hogy kifogyott a Queue, akkor éppen berakhatsz egy (Count > 0) && -t a feltétel elejére vagy Peek() helyett TryPeek(out string)-kel dolgozol.
if (s1.TryPeek(out string item) && item != "&&" && item !="||" )
{
s1.Pop();
}
[ Szerkesztve ]
-
CPT.Pirk
Jómunkásember
Ohh yeah, a Count() ellenőrzés jó lett. Erre én is gondoltam tegnap, csak akkor a while feltételeinek végére írtam és úgy nem volt hatása.
Így már fasza. Köszi a segítséget!
while (s1.Count() > 0 && s1.Peek() != "&&" && s1.Peek() != "||")
[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
-
-
CPT.Pirk
Jómunkásember
válasz joysefke #9908 üzenetére
Jaa, még ha tudnám minek kell ebből kijönnie. Sajnos nem készült dokumentáció a kódról pár soros szösszeneteken túl, így a "mire gondolt a költő" helyzet van mikor nézem mi lehet a gond.
Amúgy nálam nincs semmilyen Try-os lehetőség, se TryPop, se TryPeek. Ilyenkor mi van? Netes példákban én is láttam ezeket, de nem írták, hogy valamit kellene hozzájuk bekapcsolni.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
válasz quailstorm #9912 üzenetére
.Net 4.8
Win 10-es gépekre van tervezve a progi, ez meg azt hiszem van alapból.[ Szerkesztve ]
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
válasz CPT.Pirk #9911 üzenetére
Ilyenkor mi van?
Használod a Peek-et vagy updatelsz .NET 6-ra (Standard 2.1-re)Netes példákban én is láttam ezeket, de nem írták, hogy valamit kellene hozzájuk bekapcsolni.
1,
A MS-nak egész jó online C# / .NET doksija van /learn.microsoft.com/. Első körben, ha full homály valaminek a működése, akkor azt érdemes megnézni.
Queue<T>.Peek Method (System.Collections.Generic) | Microsoft LearnA bal felső sarokban a drop-downból ki is tudod választani, hogy mi a target framework verziója.
2,
Sajnos nem készült dokumentáció a kódról pár soros szösszeneteken túl, így a "mire gondolt a költő" helyzet van mikor nézem mi lehet a gond.Ha ténylegesen meg kell értened hogy mit csinál az a metódus amit belinkeltél, akkor mivel tiszta függvénynek tűnik és fontos logikát kódol (tehát minimális befektetéssel tudsz hasznos tesztet írni), ezért a legjobb amit tehetsz, ha írsz rá unit-teszteket, azt könnyű futtatni, debuggolni, ezért egyszerre tudod megérteni és kikupálni a függvényt.
Ehhez persze az kéne, hogy a unit teszt vagy elérje a metódust /A/ vagy a metódus ne az osztályban legyen deklarálva /D/, vagy objektumként /B/ vagy delegate-ként /C/ átadva, így tesztelhetővé válik.
[ Szerkesztve ]
-
CPT.Pirk
Jómunkásember
válasz joysefke #9914 üzenetére
Jah, marad a 4.8 elsőre, mert az van alapból W10-en.
Unit teszt... hmm jah. Az a baj, hogy egyébként nem vagyok programozó, és melóban meg annyi az egyév projekt, hogy csak ritkán tudok ezzel foglalkozni, de közben meg kéne használni... A programozás az nálam hardveresként csak jött a meló mellé, de akkor meg jellemzően beágyazott C, némi C++/QT, de leginkább Lazarus alatt freepascalban.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
CPT.Pirk
Jómunkásember
-
martonx
veterán
válasz CPT.Pirk #9917 üzenetére
Ez esetben van egy jó hírem: Most gyorsan kipróbáltam .Net 7-tel. Ezek voltak a beállításaim a csproj file-ban:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishReadyToRun>true</PublishReadyToRun>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
</Project>Lelövöm a poént 14Mb-os lett a dotnet publish után előálló .exe file-om, amiben benne van a szükséges runtime is. Igaz, hogy ez csak egy console app.
"másik nyelvnél még ilyen megoldással nem találkoztam" - nincs hátránya, hacsak az nem, hogy ilyenkor kötelező előre megmondanod, milyen OS-t célzol meg. Más nyelveknék előbb telepítened kell a runtime-ot, és majd csak utána tudsz bármit futtatni. A .Net eléggé király ezzel, hogy vinni tudja magával a minimálisan szükséges runtime-ot (gyorsan tegyük hozzá, hogy ez csak console appokra igaz cross platform szinten, nem cross-platform szinten windows only feature).
Én kérek elnézést!
-
CPT.Pirk
Jómunkásember
válasz martonx #9918 üzenetére
Zsír, megnézem majd ha "kapok időt" ezzel foglalkozni a melóban. Azon kívül, hogy lesz TryPop(), jelent nekem valami előnyt az újabb .Net-re átváltás? Mert ha nem, akkor nem biztos, hogy érdemes.
Én egyébként leginkább Lazarushoz vagyok szokva, ott bonyolultabb GUI-s appokat is csináltam de ilyennel nem kellett foglalkozni, viszont mégis csak pár megás binárisokat fordított maximum, ráadásul ezt multiplatform tudta, azonnal tudtam Linuxra is fordítani ugyanazt a kódot.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
válasz CPT.Pirk #9919 üzenetére
A projekt számára hatalmas pozitív lépés lenne, ebből a TryPop hozzáadott értéke szerintem nulla.
Egy üres konzol projektet triviális upgradelni NET6-ra, (átírsz a csproj-ban egy sort) egy nagy applikációt viszont nem lesz ilyen egyszerű.
Ha van .NET fejlesztő aki ezt főműsorban fejleszti, azt meg lehetne kérdezni, hogy ez miért nem történt még meg.
[ Szerkesztve ]
-
CPT.Pirk
Jómunkásember
válasz joysefke #9920 üzenetére
Nincs és igazából soha nem is volt főállású .NET fejlesztőnk. Mi hw fejlesztők vagyunk akik programoznak is, ebben a vonatkozásban meg jellemzően ha van is OS, akkor az nem Windows.
Mondjuk ezek a .NET-es progik belsős progik, saját használatra. Szóval belefér, hogy nem tökéletes, csak működjön.
Nincs más - csak egy szál gitár - szidom a rendszert - forradalmár. - Én vagyok egyedül 88 telén. (Auróra)
-
Alu
senior tag
Sziasztok!
Készítettem egy Windows Forms App -ot, amivel egy ubuntu alapokon lévő "házi szerver pc" -t szeretnék néhány egyszerű funkcióval vezérelni/státuszt lekérdezni. Ezek a következők lennének:
- Szerver pc pingelése
- Wake on lan küldése a szerver pc -nek (mac alapján)
- Ssh -n keresztül bejelentkezés, illetve parancs küldés és fogadás (egyenlőre rsync és shutdown parancsok lennének)Addig eljutottam, hogy létrehoztam egy Win Form App -ot, elkészítettem a felhasználói felületet és megírtam az összes függvényt, ami a fenti funkciókhoz szükségesek. A funkciókat az UI -on lévő gombokkal lehet elindítani és a függvények logolják egy multiline text boxba, hogy milyen szekvenciák futottak le, vagy éppen milyen válasz jött vissza ssh -n. A program egész jól működik azzal a szépséghibával, hogy amíg a háttérben futnak a függvények, addig az UI teljesen megfagy. Ez nem is lenne akkora probléma, de van, hogy az rsync parancs hosszú percekig, akár egy óráig fut, mire megjön a report, hogy mit sikerült szinkronizálnia. Ennek orvoslására ki szeretném rendezni a függvényeket külön szálba, hogy legalább az asztalra le lehessen tenni az UI -t és ne "Nem válaszol" státuszba kerüljön, amikor véletlenül rákattintok. A kiszervezésnél addig jutottam, hogy létrehozom a párhuzamos szálat, de amint abból a szálból szeretnék egy a fő formon lévő komponensre (pl. label, button, stb.) hivatkozni vagy annak értéket beállítani, egyből "Szálak közötti művelet érvénytelen" hibát kapok. Ezt egy logolást végző függvénynél már sikerült feloldanom Invoke használatával, de egy buttonEnable beállításnál újra előjött.
A kérdésem az lenne, hogy ezt az Invoke -os megoldást minden egyes komponensnél el kell játszani vagy van erre valami egyszerűbb út, amire még nem sikerült rátalálnom?
Eddig jellemzően mikrokontrollereket programoztam C -ben, a Win Forms, C# és oop teljesen újak számomra, de nagy a motiváció.Minden segítséget előre is köszönök!
λŁƯ™
-
quailstorm
nagyúr
A BackgroundWorker az egy jó pattern erre.
Ugyan ez WPF de itt is szépen el van magyarázva.Ha simán csak egy UI változót kell pörgetni akkor pedig az IProgress egy jó pattern. [link]
[ Szerkesztve ]
-
Nem párhuzamosítást, hanem asszinkronitást keresel. A UI-ok általában úgy működnek, hogy egyetlen, dedikált szál tudja a UI-on lévő controllokat updatelni, minden más szálból (pld egy background thread) történő update exceptiönnel végződik.
Ha a UI -threaden blokkolsz (a UI event által triggerelt kód nem másik threaden fut, vagy a UI threadet kényszeríted IO-ra várakozásra) akkor megfagy a UI egészen addig amíg a UI thread fel nem szabadul.
Arra hogy hogyan tudod a munkát egy másik szálra átvinni majd az eredményt a UI threadnek visszaadni arra a Task-Async-Pattern (async -await) való. Vannak más régi megvalósítások is. Keress async-await példát, elég egyszerű a használata.
(Nincs dolgom UI-al, de ez kb általános kell legyen, tehát a Winforms-ra is vonatkozik).
szerk:
A fent említett IProgress is egyébként egy ilyen megvalósítás. A progress reportot átküldi a UI threadre[ Szerkesztve ]
-
sztanozs
veterán
válasz joysefke #9924 üzenetére
Ennek ekes peldaja amikor excelben fut egy combosabb makro es az egesz excel ablak befagy tole. Nem csak huz szepen egy progressbart az aljab, vagy read-only-ba rajka az aktualis munkalapokat, hanem szepen atmegy not responding-ba...
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Alu
senior tag
válasz quailstorm #9923 üzenetére
& joysefke
Köszönöm a válaszokat!
Async Taskkal próbálkoztam, de pingelés során ugyan úgy megfagyasztotta a UI -t. Backgroundworkerrel még csak ma kezdtem el ismerkedni, készítettem hozzá egy új projektet teszteléshez és eddig egész jónak tűnik.
Abban tudnátok segíteni, hogy a DoWork függvényből hogyan tudom több változó értékét átvinni a ProgressChanged függvénybe? Találtam egy megoldást, ami az e.Result -ba teszi bele egy osztálynak az elemeit, majd a Completed függvényben veszi ki az e.Result -ból. A problémám ezzel, hogy nekem a ProgressChanged fv. -ben már kellenének ezek az értékek, de itt az e.Result -ra hibát kapok.Az mennyire barkács megoldás, ha létrehozok egy struktúrát és a struktúra elemein dolgozok a DoWork fv. -ben, majd amikor meghívásra kerül a ProgressChanged, akkor felhasználom a struktúra változóinak értékeit?
Illetve még egy olyan kérdésem lenne, hogy létrehoztam egy másik formot, ahol a csatlakozás beállításait szeretném módosítani. A két form között milyen megoldással tudom kicserélni a változók értékeit? Pl. Ha a Settings_Form -on beírok egy új IP címet, az hatással legyen a MainForm osztályban lévő IPAddr változóra is.
λŁƯ™
-
sztanozs
veterán
a ket form az ket kulon objektum, ugy tudsz egymas adataihoz hozzaferni, hogy az egyik formnak odaadod a masik objektum hivatkozasat es akkor a publikus elemeihez hozza tudsz ferni. Persze ha a form elemek private-nak vannak deklaralva akkor nem fog menni - de most nem remlik, hogy mi az alapbeallitas.
Progress kozben at tudsz adni barmilyen erteket, legyen az egy egyzeru valtozo, struktura vagy komolyabb objektum. A dowork fuggvenyben kell meghivnod a ProgressChanged esemenyt es atadni neki az aktualis allapotot (vagy amit kozolni akarsz az esemenyt lekezelo oldallal).JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Keem1
addikt
Srácok, ASP Net Core 7, hello world app... 🙈
Hol tudok konkrét portot definiálni (a default :5000 helyett) aProgram.cs
-ben az app.Run(); előtt?
Gugliztam egyapp.UseUrls()
-t, de aWebApplication
classnek nincs ilyen metódusa.Köszi
-
ezeket próbáltad?
WebApplication and WebApplicationBuilder in Minimal API apps | Microsoft LearnMásik opció hogy appsettings.json-ban definiálod a portot.
[ Szerkesztve ]
-
Keem1
addikt
Még egy kérdés az ASP.Net Core Razor dologban.
Adott egy view (Proba.cshtml), és benne egy@using tesztnamespace
A view-ban, ha az adott namespaceből (tesztnamespace.tesztclass.tesztmethod()
) valamit használnék, ezt kapom: tesztmethod is inaccessible due to its protection level.
Miért?
Modelből simán megy, viewből nem.Szerk: ja, igen, mind a class, mind a method public.
[ Szerkesztve ]
-
Keem1
addikt
válasz martonx #9937 üzenetére
Deee, az. Még nem jöttem rá a megoldásra, de keresem..
Kicsit más: hogy tudok egy foldert buildeléskor az exe mellé tenni? Van egy www nevű folder, pár HTML template-tel, és azt is be kéne tennie fordításkor/publishkor oda, ahova a többi file megy.
Túrom a StackOverflow-t, de még nem találtam rá megoldást.
Ja, ez már nem ASP.Net, hanem Net 6.0 service[ Szerkesztve ]
-
Keem1
addikt
Srácok, mennyire jó ötlet sessionnel loginolni? PHP-érában azt szoktam meg, de látom, ASP-ben van vmi saját auth megoldás is. Mennyire obsolete vagy unsecure a sessionös login manapság?
-
Keem1
addikt
válasz martonx #9941 üzenetére
Igen, vmi ilyesmi (leegyszerűsítve).
Az ASP.Net-et még csak most kezdtem el behatóan tanulmányozni, mivel az előző melóhely óta (idestova 4 éve) nincs szükségem igazán PHP-re, C#-ra viszont igen, így arra gondoltam, a webes tudásomat is .NET alapokon kamatoztatom, tekintve hogy a .NET 6 + ASP.Net Razor már frankón megy linuxon is (Apache mögött), így megvan minden téren az érdeklődés.namespace LearnASPNETCoreRazorPagesWithRealApps.Pages { public class IndexModel : PageModel { [BindProperty] public string Username { get; set; } [BindProperty] public string Password { get; set; } public string Msg { get; set; } public void OnGet() { } public IActionResult OnPost() { if (Username.Equals("abc") && Password.Equals("123")) { HttpContext.Session.SetString("username", Username); return RedirectToPage("Welcome"); } else { Msg = "Invalid"; return Page(); } } } }
-
martonx
veterán
Úristen a razor pagestől a mai napig kiver a víz. Php-ról áttérők miatt került bele a keretrendszerbe. Egyébként teljesen rosszul kezdtél neki, előbb doksit kellene olvasnod, nagyon jól le van írva az ASP. Net Core identity tutorialokkal. Fórumokban kérdezgetés, meg vakon neki esés helyett:
1. Doksi olvasás
2. Doksiban lévő tutorialok végig nyomásaMajd ha ezek után még van kérdés, szívesen segítek. Jól választottál ASP. Net Core-al, php után Trabant - Mercedes a különbség.
Én kérek elnézést!
-
bandi0000
nagyúr
Sziasztok,
Lenne pár kezdő kérdésem Elvállaltam egy beadandó elkészítését, igaz csak az adatbázis részt kell.
Kicsit ott vagyok elakadva, hogy nincs sok tapasztalatom C#/Entity framwork architectura kialakításában, találtam ezt a [Unit of work] csodát, ami egész szimpatikusnak tűnik, viszont az én elképzelésemben a Repository-k tartalmazzák a konkrét lekérdezéseket, amit értek ezalatt:
Pl van egy Users osztály meg nem tudom Cars, külön külön van repository mindkettőnek CRUD műveletekre, aminél ez a unit of work működik is. De mi van, ha össze kell kapcsolni 2 táblát? Annak kellene egy új repository, vagy valamelyik meglévőbe, pl Users-be belerakni a lekérdezést? Csak akkor már nem működik ez a UnitOfWork...
Kis kontexus, Android fejlesztő vagyok, és ott ugye MVVM van, Repository tartalmazza a konkrét lekérdezéseket pl getUsersWithCars és a felület csak azt hívja, és ő már nem végez rajta műveletetet
Vagy igazából ez teljesen felesleges, mert ugye a kapcsolatok miatt, a Users fogja tartalmazni a Car list-et, és akkor majd a felületen szétválasztják?
[ Szerkesztve ]
Xbox One: bandymnc
-
bandi0000
nagyúr
válasz bandi0000 #9944 üzenetére
+1
Ha ez a UnitOfWork jó dolog, és így kell működnie, akkor van valami köztes réteg még a felület és az adatbázis közt, ami pl olyan feladatot látna el, hogy mentéskor ha ügyfelet és autót akarunk menteni, akkor a felületen kb csak annyi hívás legyen, hogy: SaveClientWithCar(Client client, Car car) és ez a köztes réteg lezongorázza a mentéseket ID generálással és beállítással?Xbox One: bandymnc
-
petyus_
senior tag
válasz bandi0000 #9944 üzenetére
A táblák összekapcsolását navigation property-kkel oldod meg Entity Framework alatt. Van egy User tábla, egy Car tábla, a User class-on csinálj egy Car property-t. Így ha le akarod kérni a Usernek a Car-ját, azt pl úgy tudod, hogy
context.Users.Where(u => u.Id == id).Include(u => u.Car)
(ha nem hívod meg az include-ot, akkor alapból azokat az adatokat nem tölti be)
Ez ugyanígy működik a másik irányban is, ha Usert (Clientet) akarsz menteni Car-ral együtt, akkor legyen egy User objektumod, amin van egy Car property,
context.Users.Add(user)
context.SaveChanges()
és elmenti a Car-t is.
De ha sokszor akarod használni a Car-t, akár Usertől függetlenül, akkor érdemes csinálni egy CarRepository-t, és azon keresztül dolgozni(mondjuk arról is folyton megy a vita, hogy EntityFramework-ot használva kell-e még külön repository, mivel a DbContext már maga egy repository, meg unit of work)
-
bandi0000
nagyúr
válasz petyus_ #9946 üzenetére
Köszi, igen már közben rájöttem, hogy az járható út... Viszont lehet hülyeséget kérdezek, vagy benéztem valamit, de ha a DbContext osztályban, definiálom a kapcsolat típusát, pl létrehozom a táblák közti 1-N kapcsolatot, akkor viszont nem kell használni az include-ot, vagy igen? Mert jelenleg nem használtam mégis ott volt a car a user-en belül
Xbox One: bandymnc
-
petyus_
senior tag
válasz bandi0000 #9947 üzenetére
Attól függ, hogy definiáltad a kapcsolatokat. Ha használtad a virtual keyword-öt, akkor Lazy loading-ot használ, ez azt jelenti, hogy ha valahol használod az adott property-t, akkor ott fogja betölteni, egyébként nem. Ha nem használod a virtual-t, akkor csak akkor tölti be, ha használod az Include-ot.
Egyébként szerintem érdemes kikapcsolni a lazy loadingot (vagy mindehol elhagyod a virtual-t, vagy a context constructorában Configuration.LazyLoadingEnabled = false;). Ha mondjuk egy ciklusban végigmész a parent entity listán, és azon belül eléred a child entity-t, akkor annyiszor hívja meg a db-t, ahány elemed van a listában. Ez eléggé be tudja lassítani a dolgokat, szerintem jobb ha expliciten megadod az Include-ot ahol kell, máshol meg ne töltse be.
[ Szerkesztve ]
-
válasz bandi0000 #9945 üzenetére
Ahogy már írták a DbContext már önmagában is repository és unit of work.
Innen kezdve ha becsomagolod egy generikus repository + UoW absztrakcióba, akkor azt nem a funkcionalitás miatt teszed, hanem hogy elfedd a EntityFramework-öt, tehát hogy a repositoryt használó kód ne tudja magát az adott EfCore verzióhoz/funkciókhoz láncolni.
akkor van valami köztes réteg még a felület és az adatbázis közt, ami pl olyan feladatot látna el, hogy mentéskor ha ügyfelet és autót akarunk menteni, akkor a felületen kb csak annyi hívás legyen, hogy: SaveClientWithCar(Client client, Car car) és ez a köztes réteg lezongorázza a mentéseket ID generálással és beállítással?
Igen, a repository egy low level absztrakció az adathozzáférési rétegben.
Ha van egy featuröd (amit mondjuk egy UI page valósít meg) akkor annak a featurenek lesz konkrét igénye hogy adatokat tudjon olvasni a DB-ből (amit megjelenít a user számára) illetve a user által módosított adatokat perzisztálni tudja DB-be.
Az adatok formájára nézve a feature nyilván konkrét kívánalmakat fogalmaz meg. (e.g. mutasd az összes usert akinek van autója az autója típusával és évjáratával együtt) illetve meghatározza, hogy melyik adatmorzsa módosítható és melyik nem a feature kontextusában.Itt érdemes egy a featuret kiszolgáló, a repositorynál magasabb absztrakciós szinten lévő, data access service osztályt definiálni ami a repositoryra támaszkodva keríti elő a featuret hajtó kód számára az adatokat illetve menti el a változásokat. A repository-ból visszaadott adatokat arra a formára tudja adaptálni amilyen formában a featurnek szüksége van rá.
egy alternatíva lehet, hogy hagyod a repository patternt és ezeket az adott featuret kiszolgáló data access service osztályokat közvetlenül az Ef DbContext-re építed (DI-t használva nyilván) aztán a featuret hajtó logika használja ezeket (ezek interfészét).
[ Szerkesztve ]
-
bandi0000
nagyúr
Köszönöm mindenkinek a magyarázásokat.Kezd kialakulni bennem, hogy mit is, hogyan csinálok.
Azt hiszem Windows Forms projekt ez, jól gondolom, hogyha UI osztály hívja majd az én pl CarService osztályomat, ott a DB mentést async kell csinálni?
Illetve ha van akkor a CarService-ben egy saveCar metódus, ebben a rétegben lehet alap ellenőrzéseket csinálni? Vagy itt már feltételezhetem, hogy mindennek van értéke, ami a felületről jön
Xbox One: bandymnc
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!