W jaki sposób uzyskać jedne context bazy dla wszystkich repozytoriów ?

0

Cześć, próbuję przebrnąć przez ten ciężki temat. W jaki sposób mogę uzyskać ten sam context bazy danych dla wielu repozytoriów. Próbuję uzyskać to po przez generyczne repozytorium no i w zasadzie działa tylko jest jeden problem, konkretne repozytoria nie mogą zostać rozszerzone o dodatkowe metody.
Interfejs

  public interface IRepository<T> where T:class
    {
      
        IQueryable<T> GetAll();
        T GetById(object id);
        void Add(T entity);
        void Update(T entity);
        void Delete(T entity);
        void DeleteById(object id);
        void Save();
    }
 

Generyczne Repozytorium

 public class Repository<T> : IRepository<T> where T:class
    {
        private Baza db = null;
        private DbSet<T> table = null;


        public Repository()
        {
            this.db = new Baza ();
            table = db.Set<T>();
        }

        public Repository(Baza db)
        {
            this.db = db;
            table = db.Set<T>();
        }

        public IQueryable<T> GetAll()
        {
            return table;
        }

        public T GetById(object id)
        {
            return table.Find(id);
        }

        public void Add(T entity)
        {
            table.Add(entity);
        }

        public void Update(T entity)
        {
            table.Attach(entity);
            db.Entry(entity).State = EntityState.Modified;
        }

        public void Delete(T entity)
        {
            T exist = table.Find(entity);
            table.Remove(exist);
        }

        public void DeleteById(object id)
        {
            throw new NotImplementedException();
        }

        public void Save()
        {
            db.SaveChanges();
        }
    }
 

Mając przykładowo Repository<User>, Repository<Customer>, Repository<Employer >, jak zaimplementować różne metody dla każdego repozytorium? Bo na tę chwilę w każdym z nich są takie same metody.

1

#Nie istnieje coś takiego jak generyczne repozytorium. Może istnieć generyczne bazowe repozytorium, które jest klasą abstrakcyjną i zawiera powtarzające się funkcje, np. Update. Ewentualnie może istnieć Generyczny twór repozytorio-podobny, który jest często stosowanym "wzorcem" u ludzi, którzy nie rozumieją co to jest repozytorium.
#Użyj jakiegoś kontenera IoC (autofac, ninject, unity, ...) i wstrzykuj sobie kontekst per request/per service call/per whatever.

0

@QwertzOne Unit of Work służy aby mieć kontrolę nad tranzakcyjnością DB.
Dla konkretnego Repo możesz rozszerzyć interfejs IRepository i taki interfejs mogłaby implementować Twoja klasa

0

Dzięki za odzew. Jednak może bardziej sprecyzuje mój problem o stworzeniu jednego kontextu wydedukowałem to z mojego problemu, jednak nie wiem czy jest to odpowiednia droga, może jest na to jakiś inny prostszy sposób. W mojej aplikacji posiadam szereg tabel powiązanych ze sobą relacjami. Przy jednej z nich która wygląda tak:
table.png
podczas dodania do kontextu otrzymuje następujący błąd: Error: “An entity object cannot be referenced by multiple instances of IEntityChangeTracker". Dodam, że w każdej klasie repo. mam osobny kontext!, domyślam się, iż jest to karygodne stąd taki a nie inny temat. Tak więc czy utworzenie jednego wspólnego kontextu jest dobrą praktyką??

0
rejentt napisał(a):

Dodam, że w każdej klasie repo. mam osobny kontext!, domyślam się, iż jest to karygodne stąd taki a nie inny temat. Tak więc czy utworzenie jednego wspólnego kontextu jest dobrą praktyką??

Osobny kontekst w sensie instancję, czy klasę (w sensie model utworzony na podstawie bazy danych)?

Wszystkie repozytoria biorące udział w operacji powinny otrzymywać jeden obiekt kontekstu, najlepiej wstrzykiwany kontenerem IoC.

0

Wszystkie repozytoria biorące udział w operacji powinny otrzymywać jeden obiekt kontekstu, najlepiej wstrzykiwany kontenerem IoC.

Właśnie jak to uzyskać, mógłbym prosić o jakiś poradnik, artykuł, tutorial? Jakieś hasło przewodnie :D byłbym ogromnie wdzięczny, jest to moje pierwsze podejście więc nie mam za dużo doświadczenia. Pozdrawiam

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