Просмотр исходного кода

NEW Méthodes génériques : getBy, getById, getAll, where, add, update, remove

julien.legrand 8 лет назад
Родитель
Сommit
16ed33c569

+ 7 - 1
CD67.ModeleMVC.Entity/CD67.ModeleMVC.Entity.csproj

@@ -49,6 +49,10 @@
     <Reference Include="System" />
     <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Linq.Dynamic, Version=1.0.6132.35681, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Linq.Dynamic.1.0.7\lib\net40\System.Linq.Dynamic.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.Security" />
     <Reference Include="System.Xml.Linq" />
@@ -106,7 +110,9 @@
       <DependentUpon>EntityModel.edmx</DependentUpon>
       <LastGenOutput>EntityModel.cs</LastGenOutput>
     </None>
-    <None Include="packages.config" />
+    <None Include="packages.config">
+      <SubType>Designer</SubType>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />

+ 1 - 0
CD67.ModeleMVC.Entity/packages.config

@@ -4,4 +4,5 @@
   <package id="EntityFramework.fr" version="6.1.3" targetFramework="net451" />
   <package id="Oracle.ManagedDataAccess" version="12.1.24160719" targetFramework="net451" />
   <package id="Oracle.ManagedDataAccess.EntityFramework" version="12.1.2400" targetFramework="net451" />
+  <package id="System.Linq.Dynamic" version="1.0.7" targetFramework="net451" />
 </packages>

+ 4 - 0
CD67.ModeleMVC.Factory/CD67.ModeleMVC.Factory.csproj

@@ -49,6 +49,10 @@
     <Reference Include="System" />
     <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Linq.Dynamic, Version=1.0.6132.35681, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Linq.Dynamic.1.0.7\lib\net40\System.Linq.Dynamic.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />

+ 76 - 1
CD67.ModeleMVC.Factory/Internal/BaseFactory.cs

@@ -1,7 +1,10 @@
 using CD67.ModeleMVC.Entity;
 using System;
 using System.Collections.Generic;
+using System.Data.Entity;
 using System.Linq;
+using System.Linq.Dynamic;
+using System.Linq.Expressions;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -10,13 +13,14 @@ namespace CD67.ModeleMVC.Factory.Internal
     /// <summary>
     /// Classe de base pour toutes les classes spécialisées de la couche de service
     /// </summary>
-    public class BaseFactory : IDisposable
+    public class BaseFactory<T> : IDisposable where T : class
     {
         /// <summary>
         /// Context Entity Framework utilisé dans la classe
         /// </summary>
         protected Entities dbContext;
 
+        #region Constructeurs
         /// <summary>
         /// Constructeur sans argument pour les classes sans contexts Entity
         /// </summary>
@@ -30,6 +34,77 @@ namespace CD67.ModeleMVC.Factory.Internal
         {
             this.dbContext = dbContext;
         }
+        #endregion
+
+        #region Méthodes génériques
+        private DbSet<T> ObjectSet
+        {
+            get
+            {
+                return this.dbContext.Set<T>();
+            }
+        }
+
+        public virtual T getById(params object[] keyValues)
+        {
+            return ObjectSet.Find(keyValues);
+        }
+
+        public virtual T getBy(Expression<Func<T, bool>> expression)
+        {
+            return ObjectSet.Where(expression).FirstOrDefault();
+        }
+
+        public virtual T getBy(string dynamicExpression)
+        {
+            return ObjectSet.Where(dynamicExpression).FirstOrDefault();
+        }
+
+        public virtual List<T> getAll()
+        {
+            return getAll(null);
+        }
+
+        public virtual List<T> getAll(string sortParameter = null)
+        {
+            if (sortParameter != null) return ObjectSet.OrderBy(sortParameter).ToList();
+            else return ObjectSet.ToList();
+        }
+
+        public List<T> where(Expression<Func<T, bool>> expression, string sortParameter = null)
+        {
+            IQueryable<T> query = ObjectSet.Where(expression);
+            if (sortParameter != null) query = query.OrderBy(sortParameter);
+            return query.ToList();
+        }
+
+        public List<T> where(string dynamicExpression, string sortParameter = null)
+        {
+            IQueryable<T> query = ObjectSet.Where(dynamicExpression);
+            if (sortParameter != null) query = query.OrderBy(sortParameter);
+            return query.ToList();
+        }
+
+        public void add(ref T entity)
+        {
+            ObjectSet.Add(entity);
+            dbContext.SaveChanges();
+        }
+
+        public void update(ref T entity)
+        {
+            // On attache l'objet en paramètre au contexte, on le note bien comme modifié pour qu'il soit mis à jour
+            ObjectSet.Attach(entity);
+            dbContext.Entry(entity).State = EntityState.Modified;
+            dbContext.SaveChanges();
+        }
+
+        public void delete(ref T entity)
+        {
+            ObjectSet.Remove(entity);
+            dbContext.SaveChanges();
+        }
+        #endregion
 
         #region Dispose
         private bool disposed = false;

+ 1 - 7
CD67.ModeleMVC.Factory/SOUS_TYPE_VIKINGFactory.cs

@@ -8,14 +8,8 @@ using System.Threading.Tasks;
 
 namespace CD67.ModeleMVC.Factory
 {
-    public class SOUS_TYPE_VIKINGFactory : Internal.BaseFactory
+    public class SOUS_TYPE_VIKINGFactory
     {
-        /// <summary>
-        /// Constructeur public lié au constructeur de base
-        /// </summary>
-        /// <param name="dbContext">Context Entity Framework utilisé dans la classe</param>
-        public SOUS_TYPE_VIKINGFactory(Entities dbContext) : base(dbContext) { }
-
         /// <summary>
         /// Retourne une liste d'objets selon des paramètres
         /// </summary>

+ 5 - 49
CD67.ModeleMVC.Factory/TYPE_VIKINGFactory.cs

@@ -8,7 +8,7 @@ using System.Threading.Tasks;
 
 namespace CD67.ModeleMVC.Factory
 {
-    public class TYPE_VIKINGFactory : Internal.BaseFactory
+    public class TYPE_VIKINGFactory : Internal.BaseFactory<Entity.EXEMPLE_TYPE_VIKING>
     {
         /// <summary>
         /// Constructeur public lié au constructeur de base
@@ -17,56 +17,12 @@ namespace CD67.ModeleMVC.Factory
         public TYPE_VIKINGFactory(Entities dbContext) : base(dbContext) { }
 
         /// <summary>
-        /// Retourne un objet par son Id
+        /// Ajout d'une surcharge pour trier le retour par défaut
         /// </summary>
-        /// <param name="Id">Id recherché</param>
-        /// <returns>Objet recherché</returns>
-        public EXEMPLE_TYPE_VIKING getById(int Id)
+        /// <returns></returns>
+        public override List<Entity.EXEMPLE_TYPE_VIKING> getAll()
         {
-            return dbContext.EXEMPLE_TYPE_VIKING.Find(Id);
-        }
-
-        /// <summary>
-        /// Retourne tous les objets
-        /// </summary>
-        /// <returns>Liste d'objets</returns>
-        public List<EXEMPLE_TYPE_VIKING> getAll()
-        {
-            //avec un tri parceque c'est toujours mieux quand c'est trié
-            return dbContext.EXEMPLE_TYPE_VIKING.OrderBy(item => item.TYPE).ToList();
-        }
-
-        /// <summary>
-        /// Ajout de l'objet dans le context
-        /// </summary>
-        /// <param name="param">Objet à ajouter passé en référence pour obtenir le résultat des triggers ou numéroauto</param>
-        public void add(ref EXEMPLE_TYPE_VIKING param)
-        {
-            dbContext.EXEMPLE_TYPE_VIKING.Add(param);
-            dbContext.SaveChanges();
-        }
-
-        /// <summary>
-        /// Mise à jour de l'objet dans le context
-        /// </summary>
-        /// <param name="param">Objet à mettre à jour passé en référence pour obtenir le résultat des triggers ou numéroauto</param>
-        public void update(ref EXEMPLE_TYPE_VIKING param)
-        {
-            // On attache l'objet en paramètre au contexte, on le note bien comme modifié pour qu'il soit mis à jour
-            dbContext.EXEMPLE_TYPE_VIKING.Attach(param);
-            dbContext.Entry(param).State = EntityState.Modified;
-            dbContext.SaveChanges();
-        }
-
-        /// <summary>
-        /// Suppression de l'objet dans le context
-        /// </summary>
-        /// <param name="param">Objet à supprimer</param>
-        public void delete(ref EXEMPLE_TYPE_VIKING param)
-        {
-            // Attention à ajouter ici d'éventuel contrôle ou suppression en cascade
-            dbContext.EXEMPLE_TYPE_VIKING.Remove(param);
-            dbContext.SaveChanges();
+            return base.getAll().OrderBy(i => i.TYPE).ToList();
         }
     }
 }

+ 3 - 46
CD67.ModeleMVC.Factory/VIKINGSFactory.cs

@@ -8,7 +8,7 @@ using System.Threading.Tasks;
 
 namespace CD67.ModeleMVC.Factory
 {
-    public class VIKINGSFactory : Internal.BaseFactory
+    public class VIKINGSFactory : Internal.BaseFactory<Entity.EXEMPLE_VIKINGS>
     {
         /// <summary>
         /// Constructeur public lié au constructeur de base
@@ -17,56 +17,13 @@ namespace CD67.ModeleMVC.Factory
         public VIKINGSFactory(Entities dbContext) : base(dbContext) { }
 
         /// <summary>
-        /// Retourne un objet par son Id
-        /// </summary>
-        /// <param name="Id">Id recherché</param>
-        /// <returns>Objet recherché</returns>
-        public EXEMPLE_VIKINGS getById(int Id)
-        {
-            return dbContext.EXEMPLE_VIKINGS.Find(Id);
-        }
-
-        /// <summary>
-        /// Retourne tous les objets
+        /// Retourne tous les objets (en surchargeant la méthode standard)
         /// </summary>
         /// <returns>Liste d'objets</returns>
-        public List<EXEMPLE_VIKINGS> getAll()
+        public override List<EXEMPLE_VIKINGS> getAll()
         {
             //Ce n'est pas nécessaire ici (un lazy loading est présent par défaut), mais j'ai ajouté un include explicite pour charger les sous-objets "EXEMPLE_TYPE_VIKING"
             return dbContext.EXEMPLE_VIKINGS.Include(item => item.EXEMPLE_TYPE_VIKING).ToList();
         }
-
-        /// <summary>
-        /// Ajout de l'objet dans le context
-        /// </summary>
-        /// <param name="viking">Objet à ajouter passé en référence pour obtenir le résultat des triggers ou numéroauto</param>
-        public void add(ref EXEMPLE_VIKINGS viking)
-        {
-            dbContext.EXEMPLE_VIKINGS.Add(viking);
-            dbContext.SaveChanges();
-        }
-
-        /// <summary>
-        /// Mise à jour de l'objet dans le context
-        /// </summary>
-        /// <param name="viking">Objet à mettre à jour passé en référence pour obtenir le résultat des triggers ou numéroauto</param>
-        public void update(ref EXEMPLE_VIKINGS viking)
-        {
-            // On attache l'objet en paramètre au contexte, on le note bien comme modifié pour qu'il soit mis à jour
-            dbContext.EXEMPLE_VIKINGS.Attach(viking);
-            dbContext.Entry(viking).State = EntityState.Modified;
-            dbContext.SaveChanges();
-        }
-
-        /// <summary>
-        /// Suppression de l'objet dans le context
-        /// </summary>
-        /// <param name="viking">Objet à supprimer</param>
-        public void delete(ref EXEMPLE_VIKINGS viking)
-        {
-            // Attention à ajouter ici d'éventuel contrôle ou suppression en cascade
-            dbContext.EXEMPLE_VIKINGS.Remove(viking);
-            dbContext.SaveChanges();
-        }
     }
 }

+ 1 - 0
CD67.ModeleMVC.Factory/packages.config

@@ -3,4 +3,5 @@
   <package id="EntityFramework" version="6.1.3" targetFramework="net451" />
   <package id="Oracle.ManagedDataAccess" version="12.1.24160719" targetFramework="net451" />
   <package id="Oracle.ManagedDataAccess.EntityFramework" version="12.1.2400" targetFramework="net451" />
+  <package id="System.Linq.Dynamic" version="1.0.7" targetFramework="net451" />
 </packages>

+ 4 - 0
CD67.ModeleMVC.MVC/CD67.ModeleMVC.MVC.csproj

@@ -77,6 +77,10 @@
     <Reference Include="System.Data" />
     <Reference Include="System.DirectoryServices" />
     <Reference Include="System.Drawing" />
+    <Reference Include="System.Linq.Dynamic, Version=1.0.6132.35681, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Linq.Dynamic.1.0.7\lib\net40\System.Linq.Dynamic.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath>
       <Private>True</Private>

+ 2 - 2
CD67.ModeleMVC.MVC/Controllers/VIKINGSController.cs

@@ -155,14 +155,14 @@ namespace CD67.ModeleMVC.MVC.Controllers
             ViewBag.ID_TYPE = new SelectList(typeVikingFactory.getAll(), "ID", "TYPE", viking.ID_TYPE);
 
             //Chargement d'une liste vide à la création
-            SOUS_TYPE_VIKINGFactory sousTypeFactory = new SOUS_TYPE_VIKINGFactory(db);
+            SOUS_TYPE_VIKINGFactory sousTypeFactory = new SOUS_TYPE_VIKINGFactory();
             ViewBag.ID_SOUS_TYPE = new SelectList(sousTypeFactory.getManyBy(viking.ID_TYPE).OrderBy(i => i.Value), "Key", "Value", viking.ID_SOUS_TYPE);
         }
 
         //Mise à jour Ajax de la liste imbriquée
         public JsonResult listeSousType(int Id, int? defaultSelected)
         {
-            SOUS_TYPE_VIKINGFactory sousTypeFactory = new SOUS_TYPE_VIKINGFactory(db);
+            SOUS_TYPE_VIKINGFactory sousTypeFactory = new SOUS_TYPE_VIKINGFactory();
             List<SelectListItem> listType = new List<SelectListItem>();
 
             Dictionary<int, string> infoType = sousTypeFactory.getManyBy(Id); //le dictionnaire doit devenir une liste de types

+ 1 - 0
CD67.ModeleMVC.MVC/packages.config

@@ -35,6 +35,7 @@
   <package id="Newtonsoft.Json" version="10.0.1" targetFramework="net451" />
   <package id="Oracle.ManagedDataAccess" version="12.1.24160719" targetFramework="net451" />
   <package id="Oracle.ManagedDataAccess.EntityFramework" version="12.1.2400" targetFramework="net451" />
+  <package id="System.Linq.Dynamic" version="1.0.7" targetFramework="net451" />
   <package id="WebActivatorEx" version="2.2.0" targetFramework="net451" />
   <package id="WebGrease" version="1.6.0" targetFramework="net451" />
 </packages>

+ 4 - 0
CD67.ModeleMVC.Tests/CD67.ModeleMVC.Tests.csproj

@@ -60,6 +60,10 @@
     <Reference Include="System.Configuration" />
     <Reference Include="System.Core" />
     <Reference Include="System.Data" />
+    <Reference Include="System.Linq.Dynamic, Version=1.0.6132.35681, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Linq.Dynamic.1.0.7\lib\net40\System.Linq.Dynamic.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath>
       <Private>True</Private>

+ 1 - 0
CD67.ModeleMVC.Tests/packages.config

@@ -20,4 +20,5 @@
   <package id="Newtonsoft.Json" version="10.0.1" targetFramework="net451" />
   <package id="Oracle.ManagedDataAccess" version="12.1.24160719" targetFramework="net451" />
   <package id="Oracle.ManagedDataAccess.EntityFramework" version="12.1.2400" targetFramework="net451" />
+  <package id="System.Linq.Dynamic" version="1.0.7" targetFramework="net451" />
 </packages>