2010-05-03 1 views
4

J'ai un modèle qui ressemble à ceci:DDD et des entités de base, le modèle en utilisant plusieurs types d'identité

public interface IEntity 
{ 
    int Id { get; set; } 
} 

Alors l'idée est d'avoir mes entités héritent de cette interface:

public class User : IEntity 
{ 
    public int Id { get; set; } 
} 

Cependant , une de mes entités a en fait un Guid comme identifiant.

public class UserSession 
{ 
    public Guid Id { get; set; } 
} 

Je voudrais vraiment toutes mes entités héritant de la même interface, mais qui me forcer à ajouter une colonne d'identité à base entière à la UserSession qui est inutile puisque Guid est l'identité, mais il garderais le modèle de domaine sympa puisque toutes les entités hériteraient de la même base.

Quelles options ai-je dans ce scénario? Puis-je avoir deux interfaces de base, une pour int et une pour Guid? Dois-je ajouter une colonne d'identité dans l'entité UserSession, bien qu'elle ne soit pas nécessaire? J'ai besoin du Guid, donc je ne peux pas m'en débarrasser et le remplacer par entier.

Des idées sur les meilleures pratiques?

Répondre

3

Vous pouvez certainement implémenter la même interface IEntity dans toutes vos entités et avoir toujours un type différent dans chaque champ Id.

Entrez Generics ..

définissent votre interface comme celui-ci.

public interface IEntity<T> 
{ 
    T Id { get; set; } 
} 

Implémentation de l'interface dans votre entité ..

public class User : IEntity<int> 
{ 
    public int Id { get; set; } 
} 


public class UserSession : IEntity<Guid> 
{ 
    public Guid Id { get; set; } 
} 
+0

Très belle ! Merci! – Thomas

+0

Comment est-ce que je mettrais en application cela sur dire une interface de base de dépôt? Il était: interface publique IRepository où TEntity: IEntity – Thomas

+2

Vous devez faire un référentiel générique de TEntity et TEntityKey qui n'est pas un très bon choix de conception. Pourquoi avez-vous besoin d'avoir un champ Id dans IEntity? –

1

Essayez cette

public interface IEntity<T> 
{ 
    T Id { get; set; } 
} 

public abstract class BaseEntity<T, U> 
{ 
    U _id; 
    public U Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 
} 

Et puis

public class Person : BaseEntity<Person,int> 
{ 
    string _firstName; 
    string _lastName; 

    public string FirstName 
    { 
     get { return _firstName; } 
     set { _firstName = value; } 
    } 

    public string LastName 
    { 
     get { return _lastName; } 
     set { _lastName = value; } 
    } 
} 

ou

public class City: BaseEntity<City,Guid> 
{ 
    string _name; 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

}  
0

Utilisez toujours un Guid pour identifier une entité.

Guids présentent des avantages significatifs par rapport ints en ce sens qu'ils peuvent être générés sur le client, ce qui vous permet de libérer aux commandes batch up, afficher le résultat d'un insert en AJAX sans interroger pour l'ID, etc.

Questions connexes