2024-08-18, 15:10
  #1
Medlem
Hej! Jag har en fråga jag inte lyckas lösa på övningsuppgifter för min kurs i C#. Finns det någon som skulle kunna visa hur man löser den och förklara? Hade verkligen uppskattat hjälpen.

Frågan: Implementera UnitOfWork designmönstret med en valfri modell och låt din UnitOfWork-komponent kommunicera med en egen definierad ApplicationDbContext. Ditt UnitOfWork ska använda nedanstående Repository>TEntity>. I denna uppgift behöver ni inte skapa den egen definierade ApplicationDbContexten.

Citera
2024-08-18, 17:01
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av rikard217
Hej! Jag har en fråga jag inte lyckas lösa på övningsuppgifter för min kurs i C#. Finns det någon som skulle kunna visa hur man löser den och förklara? Hade verkligen uppskattat hjälpen.

Frågan: Implementera UnitOfWork designmönstret med en valfri modell och låt din UnitOfWork-komponent kommunicera med en egen definierad ApplicationDbContext. Ditt UnitOfWork ska använda nedanstående Repository>TEntity>. I denna uppgift behöver ni inte skapa den egen definierade ApplicationDbContexten.

En grundläggande färdighet hos studenten, eller för den delen vilken utvecklare som helst, är att kunna googla på problem.

Har du läst vad MS själva säger om det hela?
https://learn.microsoft.com/en-us/as...vc-application
Citera
2024-08-18, 18:44
  #3
Medlem
Citat:
Ursprungligen postat av Proton
En grundläggande färdighet hos studenten, eller för den delen vilken utvecklare som helst, är att kunna googla på problem.

Har du läst vad MS själva säger om det hela?
https://learn.microsoft.com/en-us/as...vc-application

Det är jag helt och hållet med på! Kan tillägga att jag har googlat och har kommit fram till ett svar men är osäker på om det är korrekt. Hur ser detta ut?

Citera
2024-08-18, 21:23
  #4
Moderator
Protons avatar
Citat:
Ursprungligen postat av rikard217
Det är jag helt och hållet med på! Kan tillägga att jag har googlat och har kommit fram till ett svar men är osäker på om det är korrekt. Hur ser detta ut?

Varför måste du proppa in alltihop i en dictionary, kan du inte ha privata fält som får hålla dina instanser istället? Koden blir enklare att läsa och dessutom är det troligen enklare för dig att avgöra om dina repos är initierade eller ej i gettersena istället för att trassla med reflection.

Tanken var ju dessutom att i den kod som använder din unitofwork skulle man använda getters i din unitofwork för att få tag på något som kan spara saker i databasen, användandes samma kontext.

Hur ska du hantera det nu? Ska dina getters försöka få tag på nåt ur dictionaryn där du lagt referenseerna nu?

Som användare av din klass kommer jag bli skitsur om jag får tag på nån jäkla dictionary som jag ska försöka lista ut hur den funkar. Det jag däremot vill ha är properties som heter nåt vettigt som levererar det de säger de ska leverera, till exempel "KursRepository" eller vad det nu är du ska spara.
__________________
Senast redigerad av Proton 2024-08-18 kl. 21:28.
Citera
2024-08-18, 22:08
  #5
Medlem
Citat:
Ursprungligen postat av Proton
Varför måste du proppa in alltihop i en dictionary, kan du inte ha privata fält som får hålla dina instanser istället? Koden blir enklare att läsa och dessutom är det troligen enklare för dig att avgöra om dina repos är initierade eller ej i gettersena istället för att trassla med reflection.

Tanken var ju dessutom att i den kod som använder din unitofwork skulle man använda getters i din unitofwork för att få tag på något som kan spara saker i databasen, användandes samma kontext.

Hur ska du hantera det nu? Ska dina getters försöka få tag på nåt ur dictionaryn där du lagt referenseerna nu?

Som användare av din klass kommer jag bli skitsur om jag får tag på nån jäkla dictionary som jag ska försöka lista ut hur den funkar. Det jag däremot vill ha är properties som heter nåt vettigt som levererar det de säger de ska leverera, till exempel "KursRepository" eller vad det nu är du ska spara.

Tack för ditt svar, uppskattar verkligen din feedback! Jag förstår varför Dictionarys kanske inte var det bästa valet så jag uppdaterade koden så att varje repository nu är en privat fält men la bara in ett för enkelhetens skull. Är det nåt som ser galet ut?
Och jag insåg att flashback har kod taggar..

Kod:
public class UnitOfWork : IUnitOfWork, IDisposable
{
    private readonly ApplicationDbContext _context;
    private IRepository<Kurs> _kursRepository;

    public UnitOfWork(ApplicationDbContext context)
    {
        _context = context;
    }

    public IRepository<Kurs> KursRepository
    {
        get
        {
            if (_kursRepository == null)
            {
                _kursRepository = new Repository<Kurs>(_context);
            }
            return _kursRepository;
        }
    }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}
Citera
2024-08-18, 22:18
  #6
Moderator
Protons avatar
Citat:
Ursprungligen postat av rikard217
Tack för ditt svar, uppskattar verkligen din feedback! Jag förstår varför Dictionarys kanske inte var det bästa valet så jag uppdaterade koden så att varje repository nu är en privat fält men la bara in ett för enkelhetens skull. Är det nåt som ser galet ut?
Och jag insåg att flashback har kod taggar..

Kod:
public class UnitOfWork : IUnitOfWork, IDisposable
{
    private readonly ApplicationDbContext _context;
    private IRepository<Kurs> _kursRepository;

    public UnitOfWork(ApplicationDbContext context)
    {
        _context = context;
    }

    public IRepository<Kurs> KursRepository
    {
        get
        {
            if (_kursRepository == null)
            {
                _kursRepository = new Repository<Kurs>(_context);
            }
            return _kursRepository;
        }
    }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}
Nej nu ser det betydligt trevligare ut och mer vilsamt för ögonen att läsa.
Det där var vad jag hade i åtanke med.

Återstår då bara att undersöka om det funkar?
Citera
2024-09-03, 08:52
  #7
Medlem
Citat:
Ursprungligen postat av rikard217
Tack för ditt svar, uppskattar verkligen din feedback! Jag förstår varför Dictionarys kanske inte var det bästa valet så jag uppdaterade koden så att varje repository nu är en privat fält men la bara in ett för enkelhetens skull. Är det nåt som ser galet ut?
Och jag insåg att flashback har kod taggar..

Kod:
public class UnitOfWork : IUnitOfWork, IDisposable
{
    private readonly ApplicationDbContext _context;
    private IRepository<Kurs> _kursRepository;

    public UnitOfWork(ApplicationDbContext context)
    {
        _context = context;
    }

    public IRepository<Kurs> KursRepository
    {
        get
        {
            if (_kursRepository == null)
            {
                _kursRepository = new Repository<Kurs>(_context);
            }
            return _kursRepository;
        }
    }

    public int Complete()
    {
        return _context.SaveChanges();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

Jag tycker dipose av db context sker utanför din klass via DI. Vilket sker automatiskt om du använder EFs

Kod:
services.AddDbContext<MyDbContext>(...)

Men kan också göras manuellt för eget interface/klass.
services.AddScoped<IApplicationDbContext, ApplicationDbContext>();

Sedan tycker jag du ska injecta repository i konstruktorn. Denna behöver inte vara scoped efter som den tar en scopad DbContext, mao kan den vara Transient.

När man kör med UnitOfWork med korta lås så är det bra att titta lite på Concurrency tokens i EF för att säkerställa datakvalite.

Kod:
var entities = _repo.List();

//annan tråd muterar data i db här, sedan når din tråd raden under
entities .ForEach(e => e.MyProp = foo);

//Utan Concurrency token kommer savechanges inte smälla här och du har potentiellt korruptat data.
_db.SaveChanges();

edit: detta kallas också optimistiskt låsning. Och en nyckel för hög prestanda i transakta system
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in