[EntityFramework 4.0] General repository in DAL

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste ontwikkelaars,

Ik ben in een nieuw project bezig om gebruik te maken van het niet Entity Framework van .NET 4.0. Ik moet zeggen dat ik er zeer van onder de indruk ben, veruit de beste en gemakkelijkste manier om een DAL op te bouwen.

Nu maak ik gebruik van DTO's om mijn server data naar de clients te krijgen (ter optimalisatie). Ik wil graag gebruik maken van een repository pattern om mijn code overzichtelijk te houden en om dubbele code tegen te gaan. Opzich is dit geen probleem alleen heb ik zeer veel entiteiten en gedurende het ontwikkelen krijg ik het gevoel dat ik heel veel werk aan het doen ben wat niet nodig is.

Ik ben opzoek naar een soort van generale repository waarmee ik CRUD operaties kan uitvoeren, zodat ik deze niet voor iedere entiteit in een eigen repository hoef te defineren.
Ik zal even verduidelijken wat ik bedoel met een voorbeeld.

Ik heb een entiteit: Customer
in mijn dal krijg ik dan: RepositoryCustomer

vervolgens zal die repository altijd de volgende methoden bevatten:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public int CreateCustomer(Customer customer)
{
    DataContext.CustomerSet.AddObject(customer);
    DataContext.SaveChanges();
    return customer.Id;
}

public Customer ReadById(int Id)
{
    return DataContext.CustomerSet.Where(x => x.Id == Id).FirstOrDefault();
}

public void UpdateCustomer(Customer customer)
{
    DataContext.CustomerSet.ApplyCurrentValues(customer);
    DataContext.SaveChanges();
}

public void DeleteCustomer(int Id)
{
    DataContext.CustomerSet.DeleteObject(DataContext.CustomerSet.Where(x => x.Id == Id).FirstOrDeafult());
}


Dit is allemaal heel basic maar iedere entity heeft minimaal deze basic functionaliteit nodig. Zoals je ziet is het enige wat voor een andere entiteit anders zal zijn het entiteit type. Het moet toch mogelijk zijn om deze functies zo te defineren zodat je ze kunt gebruiken voor iedere entiteit binnen mijn project..?

Alle suggesties zijn meer dan welkom :P

[ Voor 0% gewijzigd door RobIII op 22-04-2010 22:17 . Reden: Code tags aangepast. Syntax hightlighting FTW \0/ ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben zelf al tot een aardige oplossing kunnen komen. Deze wil ik met jullie delen om andere die met hetzelfde problemen stoeien te helpen en natuurlijk ook om feedback op te krijgen.. :)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public Object GetById(string entitySet, string entityKeyColumn, int id)
        {
            Object entity = null;
            // Get key values for the requested entity set
            IEnumerable<KeyValuePair<string, object>> entityKeyValues =
                new KeyValuePair<string, object>[] {
            new KeyValuePair<string, object>(entityKeyColumn, id) };

            // Create key for the requested entity
            EntityKey key = new EntityKey(String.Format("Apollo2010ServerDataModelContainer.{0}",entitySet), entityKeyValues);

            // Get the object from the context or the persisted store by its key.
            if (DataContext.TryGetObjectByKey(key, out entity))
            {
                return entity;
            }
            else
            {
                return null;
            }

        }

        public Object AddEntity(string entitySet, Object entity)
        {
            // Add entity to the context
            DataContext.AddObject(entitySet, entity);
            DataContext.SaveChanges();

            // Return object to sender so it can get the Id
            return entity;
        }

        public void UpdateEntity(string entitySet, Object entity)
        {
            DataContext.ApplyCurrentValues(entitySet, entity);
            DataContext.SaveChanges();
        }

        public void DeleteAddressing(Object entity)
        {
            DataContext.DeleteObject(entity);
        }

[ Voor 0% gewijzigd door RobIII op 22-04-2010 22:17 . Reden: Code tags aangepast. Syntax hightlighting FTW \0/ ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Tsja, volgens mij kun je iets als die AddEntity gewoon generic maken. Iets als:
C#:
1
2
3
4
5
6
7
8
9
        public T AddEntity<T>(T entity) 
        {            
            // Add entity to the context
            DataContext.AddObject(entity.GetType().Name, entity);
            DataContext.SaveChanges();

            // Return object to sender so it can get the Id
            return entity;
        } 

Hoewel dat ook gewoon void kan zijn, want returnen lijkt me niet zo boeiend. Die laatste methode is een methode die mij niet zo nodig lijkt - gewoon een alias. Die getById lijkt me ook niet zo nodig als je gewoon DataContext.CustomerSet.FirstOrDefault(x => x.Id == Id) kan doen. Overigens is er een handigere constructor voor zo'n Key. Maar waarom is die getById-functie eigenlijk nodig, want hoe kom je aan losse id's? ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • CodeIT
  • Registratie: Juni 2002
  • Laatst online: 12:02

CodeIT

Code IT

Op deze link: http://www.rocksolidknowledge.com/ScreenCasts.mvc (bovenste item) wordt bovenstaande (met generics) voor het Repository pattern goed en duidelijk uitgelegd.

Acties:
  • 0 Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 13-09 17:54
pedorus schreef op vrijdag 23 april 2010 @ 00:10:
Die getById lijkt me ook niet zo nodig als je gewoon DataContext.CustomerSet.FirstOrDefault(x => x.Id == Id) kan doen.
Het grote voordeel van een repo met dit soort functies is dat je bijv. je caching op een centrale plaats makkelijk in kan bakken. Bovendien leer je je devs aan om altijd van de repo gebruik te maken, en dat is voor complexe queries wel zo handig.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Whoops, ik heb de tweede post opgevat als een rijtje utility functions ipv een implementatie van het repository pattern, omdat ik dat er niet in zag.. :X Nou ja, een goede implementatie zal met generics gaan, als ik even door die screencast ga wordt het daar wel generiek gedaan, en is TS niet iemand die het wiel moet gaan uitvinden. ;) Overigens zit het voordeel hem juist bij de simpele ipv de complexe queries. Ook: eenvoudiger overstappen mocht je ooit van EF af willen (hoewel ik verwacht dat een switch zelden een goede business case heeft en ook zelden voorkomt).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor jullie reacties! Ik met die screencast van RockSolidKnowledge aan de gang gegaan en dit is het resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class Repository_Generic<T> : RepositoryBase where T:class
    {
        protected ObjectSet<T> objectSet;

        public Repository_Generic() : base() 
        {
            objectSet = DataContext.CreateObjectSet<T>();
            
        }
        public Repository_Generic(Apollo2010ServerDataModelContainer _dataContext) : base(_dataContext) 
        {
            objectSet = DataContext.CreateObjectSet<T>();
        }

        public IQueryable<T> Entities
        {
            get
            {
                return objectSet;
            }
        }

        public T New()
        {
            return objectSet.CreateObject<T>();
        }

        public void Update(Expression<Func<T, bool>> where, T entity)
        {
            T tempEntity = objectSet.First(where);
            objectSet.ApplyCurrentValues(entity);
        }

        public void Create(T entity)
        {
            objectSet.AddObject(entity);
        }

        public void Delete(T entity)
        {
            objectSet.DeleteObject(entity);
        }

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

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

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je repository heeft nog steeds een dependency op je gegenereerde context.

Ook ontgaat me het nut, alle methods zijn minieme wrappers

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1