In questo esempio, TItem.GetKeyType()
è ciò che mi piacerebbe ottenere.
Definizione dell'interfaccia del repository CRUD di base:
ICrudRepository<TItem> where TItem : BaseItem where TKey : TItem.GetKeyType()
public Tkey Id { get; set; }
Definizione entità di base:
class BaseItem<TKey>
this.GetKeyType = Tkey.GetType()
Implementazione delle entità:
class Book : BaseItem<Int> //declaration of item's tkey
Implementazione dell'interfaccia CRUD:
IBooksRepository : ICrudRepository<Book>
BookRepository : IBookRepository --> Ignorance of key struct
In questo modo, chiunque implementa BooksRepository è costretto a utilizzare la struttura di implementazione dell'entità, int
in questo caso.
Inoltre, potrei definire nuove entità usando chiavi diverse usando la stessa entità di base e il repository crud, per esempio
class Truck : BaseItem<Guid>
Al momento ci sono 2 problemi
- Nell'interfaccia CRUD, non posso chiamare TItem.GetKeyType (), anche se so che il suo tipo è BaseItem, quindi deve definire questo metodo
- Non posso chiamare TKey.GetType () su BaseItem, anche se deve essere una struct, definendo così questo metodo
C'è un modo per ottenere questo tipo di pattern, senza dover definire più BaseEntities e CRUD Repositories per ogni tipo di chiave / struttura che si intende utilizzare, su un sistema in cui le chiavi possono essere di tipi diversi?