-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathentities.html
136 lines (114 loc) · 9.05 KB
/
entities.html
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Entités</title>
<link href="bootstrap.min.css" type="text/css" rel="stylesheet" />
</head>
<body>
<div class="document-contents">
<p>Les entités sont l'un des concepts phares du DDD (Domain Driven Design). Eric Evans les décrit de cette manière "<em>Un objet n'est pas fondammentalement défini par ses attributs, mais plutôt par ses traits d'identitiés durables</em>". Les entités ont des identifiants et sont stockés en base de données. Une entité est généralement mappée en correspondance à une table de la base de données.</p>
<h3 id="DocEntityClasses">Classes Entités</h3>
<p>Dans ASP.NET Boilerplate, les entités dérivent de la classe <strong>Entity</strong>. Voyez plutôt:</p>
<pre lang="cs">public class Person : Entity
{
public virtual string Name { get; set; }
public virtual DateTime CreationTime { get; set; }
public Task()
{
CreationTime = DateTime.Now;
}
}</pre>
<p><strong>Person</strong> est une classe définie comme Entité. Elle possède deux propriétés. La classe Entity définit la propriété <strong>Id</strong>. Il s'agit de la <strong>clef primaire</strong> de l'Entité. De fait, le nom des clefs primaires est toujours <strong>Id</strong>.</p>
<p>Le type de l'identifiant (primary key) peut être changé mais c'est le type <strong>int </strong>(Int32) par défaut. Si vous voulez définir un autre type, vous pouvez le faire explicitement comme montré ci-dessous:</p>
<pre lang="cs">public class Person : Entity<long>
{
public virtual string Name { get; set; }
public virtual DateTime CreationTime { get; set; }
public Task()
{
CreationTime = DateTime.Now;
}
}</pre>
<p>Vous pouvez donc les définir comme string, Guid ou tout autre chose.</p>
<p>Les classes Entités surchargent l'opérateur <strong>equality</strong> (==) pour vérifier facilement si deux entités sont égales. La méthode <strong>
IsTransient()</strong> vérifie si un id est défini ou pas.</p>
<h3 id="DocConventionalInterfaces">Les Conventions via les interfaces</h3>
<p>Dans beaucoup d'applications, les propriétés sont similaires (en correspondance des champs des tables) et souvent utilisées comme CreationTime qui indique à quel moment l'entité a été créée. ASP.NET
Boilerplate fournit quelques interfaces utiles pour gérer ces propriétés communes de manière explicite. Cela fournit un moyen pour unifier le développement des Entités en implémentant ces interfaces.</p>
<h4 id="DocAuditing">Supervision</h4>
<p><strong>IHasCreationTime</strong> crée si possible une propriété pour l'information '<strong>creation time</strong>' d'une Entité. ASP.NET Boilerplate paramètre automatiquement la date de création en fonction lorsqu'une entité est insérée en base de données, si l'Entité implémente cette interface.</p>
<pre lang="cs">public interface IHasCreationTime
{
<span lang="tr"> </span>DateTime CreationTime { get; set; }
}</pre>
<p>La classe Person pourrait être ré-écrite comme si dessous en implémentant IHasCreationTime:</p>
<pre lang="cs">public class Person : Entity<long>, IHasCreationTime
{
public virtual string Name { get; set; }
public virtual DateTime CreationTime { get; set; }
public Task()
{
CreationTime = DateTime.Now;
}
}</pre>
<p><strong>ICreationAudited</strong> étend IHasCreationTime en y ajoutant <strong>CreatorUserId</strong>:</p>
<pre lang="cs">public interface ICreationAudited : IHasCreationTime
{
long? CreatorUserId { get; set; }
}</pre>
<p>ASP.NET Boilerplate affecte automatiquement CreatorUserId en fonction de <strong>l'id de l'utilisateur courant</strong> lorsqu'une nouvelle entité est enregistrée en base de données.. Vous pouvez implémenter aussi facilement ICreationAudited en dérivant votre entité de la classe <strong>CreationAuditedEntity</strong>. Il existe une version générique pour chaque type d'identifiant souhaité.</p>
<p>Il existe également des interfaces similaires pour la gestion des modifications:</p>
<pre lang="cs">public interface IHasModificationTime
{
DateTime? LastModificationTime { get; set; }
}
public interface IModificationAudited : IHasModificationTime
{
long? LastModifierUserId { get; set; }
}</pre>
<p>ASP.NET Boilerplate affecte donc automatiquement ces propriétés lorsqu'une Entité est mise à jour. Vous devez juste l'implémenter sur votre entité.</p>
<p>Si vous voulez implémenter toutes les propriétés de traçabilité, vous pouvez directement implémenter l'interface
<strong>IAudited</strong>:</p>
<pre lang="cs">public interface IAudited : ICreationAudited, IModificationAudited
{
}</pre>
<p>En raccourci, vous pouvez dériver de la classe <strong>AuditedEntity </strong>ou implémenter directement <strong>IAudited</strong>. La classe AuditedEntity possède donc une version générique pour chaque type d'Id.</p>
<p>Note: ASP.NET Boilerplate fournit l'id courant à parit du composant
<a href="/Pages/Documents/Abp-Session">ABP Session</a>.</p>
<h4 id="DocSoftDelete">Suppression douce</h4>
<p>La suppression douce (Soft delete) est un pattern utiilsé habituellement pour marquer un objet comme supprimé au lieu de le supprimer réellement en base de données. Par exemple, vous pourriez souhaiter supprimer complètement un utilisateur de la base de données mais il peut exister beaucoup de restrictions, L'interface <strong>ISoftDelete</strong> est utilisée dans ce but.:</p>
<pre lang="cs">public interface ISoftDelete
{
bool IsDeleted { get; set; }
}</pre>
<p>ASP.NET Boilerplate implémente le soft delete pour un usage prêt à l'emploi. Quand une entité implémente le soft-delete, ASP.NET Boilerplate le détecte, intercepte la suppression et affecte la propriété IsDeleted à vrai et réalise l'update en base de données. Bien sûr, lors de la récupération des données (select), les données marquées comme supprimées sont automatiquement filtrées par le framework..</p>
<p>Si vous voulez utiliser le soft delete, vous pouvez vouloir enregistrer d'avantages d'informations lorsqu'une entité est supprimée et qui est à l'origine de l'action. Vous pouvez implémenter <strong>IDeletionAudited</strong> comme illustré ci-dessous:</p>
<pre lang="cs">public interface IDeletionAudited : ISoftDelete
{
long? DeleterUserId { get; set; }
DateTime? DeletionTime { get; set; }
}
</pre>
<p>IDeletionAudited étend ISoftDelete comme attendu. ASP.NET Boilerplate
affecte automatiquement des propriétés quand une entité est supprimée.</p>
<p>Si vous souhaitez implémenter toutes les interfaces de suppervision (création, modifications et suppression) pour une entité, vous pouvez directement implémenter <strong>IFullAudited</strong>:</p>
<pre lang="cs">public interface IFullAudited : IAudited, IDeletionAudited
{
}</pre>
<p>NOTE: Toutes les classes et interfaces ont une version générique pour définir des propriétés de relation à vos entités <strong>Utilisateur</strong> (comme ICreationAudited<TUser> et
FullAuditedEntity<TPrimaryKey, TUser>). </p>
<h4 id="DocActivePassive">Actif/Passif</h4>
<p>Des entités ont besoins d'être notées comme Active ou Passive (ou Archivée). Vous pouvez implémenter l'interface <strong>
IPassivable</strong>. Elle définit la propriété <strong>IsActive</strong>.</p>
<p>Si votre entité devient active dès sa création, vous pouvez affecter IsActive à vrai au niveau du constructeur.</p>
<p>Cette notion est différente du principe de soft delete (IsDeleted). Si une entité est soft deleted,
elle ne pourra pas être récupérée, par défaut, dans le base de données. (ABP s'en préoccupe par défaut). Par contre, dans le cas des entités actives/passives, c'est à vous de gérer le comportement de ces entités archivées.</p>
<h3 id="DocIEntityInterfaces">Observateurs des changements</h3>
<p>ASP.NET Boilerplate fournit automatiquement certains évènements lorsqu'une entité est insérée, mise à jour et supprimée. De ce fait, vous pouvez vous abonner à ces évènements et effectuer les tâches métiers dont vous avez besoin. Reportez vous à la section Evènements Prédéfinis au niveau de la section <a href="/Pages/Documents/EventBus-Domain-Events">event bus</a> pour plus de détails.</p>
<h3>Les interfaces IEntity</h3>
<p>Actuellement les classes <strong>Entity</strong> implémentent l'interface <strong>IEntity</strong> (et <strong>Entity<TPrimaryKey></strong> implémentent <strong>IEntity<TPrimaryKey></strong>).
Si vous de voulez pas dériver de la classe Entity, vous pouvez implémenter ces interfaces directement. Il en va de même pour les autres interfaces des classes Entité. Cependant, cela ne devrait être nécessaire que dans des cas bien justifiés.</p>
</div>
</body>
</html>