Przeglądaj źródła

switched to transient dbcontext

tags/v0.2.0
Robin Thoni 7 lat temu
rodzic
commit
4949969832

+ 30
- 29
Luticate2.Utils/DataAccess/LuEfCrudDataAccess.cs Wyświetl plik

@@ -21,7 +21,7 @@ namespace Luticate2.Utils.DataAccess
21 21
         where TDboUpdate : class
22 22
         where TDbContext : DbContext
23 23
     {
24
-        protected LuEfCrudDataAccess(TDbContext db, DbSet<TModel> table) : base(db, table)
24
+        protected LuEfCrudDataAccess(IServiceProvider serviceProvider) : base(serviceProvider)
25 25
         {
26 26
         }
27 27
 
@@ -66,19 +66,19 @@ namespace Luticate2.Utils.DataAccess
66 66
             return id;
67 67
         }
68 68
 
69
-        protected virtual IQueryable<TModel> GetGetQueryable()
69
+        protected virtual IQueryable<TModel> GetGetQueryable(DbContext db, DbSet<TModel> table)
70 70
         {
71
-            return Table;
71
+            return table;
72 72
         }
73 73
 
74
-        protected virtual IQueryable<TModel> GetEditQueryable()
74
+        protected virtual IQueryable<TModel> GetEditQueryable(DbContext db, DbSet<TModel> table)
75 75
         {
76
-            return Table;
76
+            return table;
77 77
         }
78 78
 
79
-        protected virtual IQueryable<TModel> GetDeleteQueryable()
79
+        protected virtual IQueryable<TModel> GetDeleteQueryable(DbContext db, DbSet<TModel> table)
80 80
         {
81
-            return Table;
81
+            return table;
82 82
         }
83 83
 
84 84
         protected Func<TDboRead, T> GetIdFunc<T>()
@@ -97,9 +97,9 @@ namespace Luticate2.Utils.DataAccess
97 97
             return LuResult<T>.Error(LuStatus.NotFound, typeof(TModel).Name + ": Value not found", "");
98 98
         }
99 99
 
100
-        protected IQueryable<TModel> GetFilterQuery(LuFilterDbo filter)
100
+        protected IQueryable<TModel> GetFilterQuery(LuFilterDbo filter, DbContext db, DbSet<TModel> table)
101 101
         {
102
-            return GetGetQueryable().Where(GetFilterExpression(filter));
102
+            return GetGetQueryable(db, table).Where(GetFilterExpression(filter));
103 103
         }
104 104
 
105 105
 
@@ -107,14 +107,14 @@ namespace Luticate2.Utils.DataAccess
107 107
 
108 108
         public LuResult<T> Add<T>(IEnumerable<TDboCreate> objs, Func<IEnumerable<TDboRead>, T> returnFunc)
109 109
         {
110
-            return Execute(() =>
110
+            return Execute((db, table) =>
111 111
             {
112 112
                 var models = objs.Select(GetModelFromTCreate).ToList();
113
-                Table.AddRange(models);
114
-                Db.SaveChanges();
113
+                table.AddRange(models);
114
+                db.SaveChanges();
115 115
                 foreach (var model in models)
116 116
                 {
117
-                    Db.Entry(model).State = EntityState.Detached;
117
+                    db.Entry(model).State = EntityState.Detached;
118 118
                 }
119 119
                 var dbos = models.Select(GetDboFromModel).ToList();
120 120
                 var res = returnFunc(dbos);
@@ -155,9 +155,9 @@ namespace Luticate2.Utils.DataAccess
155 155
 
156 156
         public LuResult<TDboRead> GetSingle(Expression<Func<TModel, bool>> predicate)
157 157
         {
158
-            return Execute(() =>
158
+            return Execute((db, table) =>
159 159
             {
160
-                var model = GetGetQueryable().AsNoTracking().FirstOrDefault(predicate);
160
+                var model = GetGetQueryable(db, table).AsNoTracking().FirstOrDefault(predicate);
161 161
                 if (model == default(TModel))
162 162
                 {
163 163
                     return GetNotFoundResult<TDboRead>();
@@ -187,9 +187,9 @@ namespace Luticate2.Utils.DataAccess
187 187
             Expression<Func<TModel, bool>> predicate, int page = 0, int perPage = int.MaxValue,
188 188
             params Func<IOrderedQueryable<TModel>, IOrderedQueryable<TModel>>[] otherOrderBy)
189 189
         {
190
-            return Execute(() =>
190
+            return Execute((db, table) =>
191 191
             {
192
-                var queryable = GetGetQueryable();
192
+                var queryable = GetGetQueryable(db, table);
193 193
                 var count = queryable.Count(predicate);
194 194
                 var ordered = orderBy(queryable);
195 195
                 foreach (var func in otherOrderBy)
@@ -227,11 +227,12 @@ namespace Luticate2.Utils.DataAccess
227 227
             return GetMultiple(orderBy, x => true, page, perPage, otherOrderBy);
228 228
         }
229 229
 
230
-        public LuResult<LuPaginatedDbo<TDboRead>> GetMultiple(LuOrderByDbo orderBy, IQueryable<TModel> queryable,
230
+        public LuResult<LuPaginatedDbo<TDboRead>> GetMultiple(LuOrderByDbo orderBy, Func<TDbContext, DbSet<TModel>, IQueryable<TModel>> getQueryable,
231 231
             int page = 0, int perPage = int.MaxValue)
232 232
         {
233
-            return Execute(() =>
233
+            return Execute((db, table) =>
234 234
             {
235
+                var queryable = getQueryable(db, table);
235 236
                 var count = queryable.Count();
236 237
                 IOrderedQueryable<TModel> ordered = null;
237 238
                 foreach (var field in orderBy.Fields)
@@ -265,12 +266,12 @@ namespace Luticate2.Utils.DataAccess
265 266
         public LuResult<LuPaginatedDbo<TDboRead>> GetMultiple(LuOrderByDbo orderBy, LuFilterDbo filter,
266 267
             int page = 0, int perPage = int.MaxValue)
267 268
         {
268
-            return GetMultiple(orderBy, GetFilterQuery(filter), page, perPage);
269
+            return GetMultiple(orderBy, (db, table) => GetFilterQuery(filter, db, table), page, perPage);
269 270
         }
270 271
 
271 272
         public LuResult<LuPaginatedDbo<TDboRead>> GetMultiple(LuOrderByDbo orderBy, int page = 0, int perPage = int.MaxValue)
272 273
         {
273
-            return GetMultiple(orderBy, GetGetQueryable(), page, perPage);
274
+            return GetMultiple(orderBy, GetGetQueryable, page, perPage);
274 275
         }
275 276
 
276 277
 
@@ -278,17 +279,17 @@ namespace Luticate2.Utils.DataAccess
278 279
         public LuResult<T> Edit<T>(Expression<Func<TModel, bool>> predicate, Action<TModel> update,
279 280
             Func<IEnumerable<TDboRead>, T> returnFunc)
280 281
         {
281
-            return Execute(() =>
282
+            return Execute((db, table) =>
282 283
             {
283
-                var models = GetEditQueryable().Where(predicate).AsNoTracking();
284
+                var models = GetEditQueryable(db, table).Where(predicate).AsNoTracking();
284 285
                 var editedDbos = new List<TDboRead>();
285 286
                 foreach (var model in models)
286 287
                 {
287 288
                     update(model);
288 289
                     editedDbos.Add(GetDboFromModel(model));
289
-                    Db.Entry(model).State = EntityState.Modified;
290
+                    db.Entry(model).State = EntityState.Modified;
290 291
                 }
291
-                Db.SaveChanges();
292
+                db.SaveChanges();
292 293
                 var res = returnFunc(editedDbos);
293 294
                 return LuResult<T>.Ok(res);
294 295
             });
@@ -355,11 +356,11 @@ namespace Luticate2.Utils.DataAccess
355 356
         public LuResult<T> Delete<T>(Expression<Func<TModel, bool>> predicate,
356 357
             Func<IEnumerable<TDboRead>, T> returnFunc)
357 358
         {
358
-            return Execute(() =>
359
+            return Execute((db, table) =>
359 360
             {
360
-                var models = GetDeleteQueryable().Where(predicate).AsNoTracking().ToList();
361
-                Table.RemoveRange(models);
362
-                Db.SaveChanges();
361
+                var models = GetDeleteQueryable(db, table).Where(predicate).AsNoTracking().ToList();
362
+                table.RemoveRange(models);
363
+                db.SaveChanges();
363 364
                 var dbos = models.Select(GetDboFromModel);
364 365
                 return LuResult<T>.Ok(returnFunc(dbos));
365 366
             });

+ 11
- 8
Luticate2.Utils/DataAccess/LuEfDataAccess.cs Wyświetl plik

@@ -10,21 +10,24 @@ namespace Luticate2.Utils.DataAccess
10 10
         where TModel : class
11 11
         where TDbContext : DbContext
12 12
     {
13
-        protected readonly TDbContext Db;
13
+        private readonly IServiceProvider _serviceProvider;
14 14
 
15
-        protected readonly DbSet<TModel> Table;
16
-
17
-        protected LuEfDataAccess(TDbContext db, DbSet<TModel> table)
15
+        protected LuEfDataAccess(IServiceProvider serviceProvider)
18 16
         {
19
-            Db = db;
20
-            Table = table;
17
+            _serviceProvider = serviceProvider;
21 18
         }
22 19
 
23
-        public LuResult<T> Execute<T>(Func<LuResult<T>> func)
20
+        protected abstract DbSet<TModel> GetTable(TDbContext db);
21
+
22
+        public LuResult<T> Execute<T>(Func<TDbContext, DbSet<TModel>, LuResult<T>> func)
24 23
         {
25 24
             try
26 25
             {
27
-                return func();
26
+                using (var db = (TDbContext)_serviceProvider.GetService(typeof(TDbContext)))
27
+                {
28
+                    var table = GetTable(db);
29
+                    return func(db, table);
30
+                }
28 31
             }
29 32
             catch (Exception e)
30 33
             {

+ 7
- 1
TestUtils/DataAccess/LuUtilsPkBigSerialDataAccess.cs Wyświetl plik

@@ -2,6 +2,7 @@
2 2
 using System.Linq.Expressions;
3 3
 using Luticate2.Utils.DataAccess;
4 4
 using Luticate2.Utils.Dbo.Filter;
5
+using Microsoft.EntityFrameworkCore;
5 6
 using TestUtils.DataAccess.Models;
6 7
 using TestUtils.Dbo.PkBigSerial;
7 8
 
@@ -9,10 +10,15 @@ namespace TestUtils.DataAccess
9 10
 {
10 11
     public class LuUtilsPkBigSerialDataAccess : LuEfCrudDataAccess<pk_bigserial, PkBigSerialAddDbo, PkBigSerialDbo, PkBigSerialAddDbo, LuUtilsDbContext, long>
11 12
     {
12
-        public LuUtilsPkBigSerialDataAccess(LuUtilsDbContext db) : base(db, db.pk_bigserial)
13
+        public LuUtilsPkBigSerialDataAccess(IServiceProvider serviceProvider) : base(serviceProvider)
13 14
         {
14 15
         }
15 16
 
17
+        protected override DbSet<pk_bigserial> GetTable(LuUtilsDbContext db)
18
+        {
19
+            return db.pk_bigserial;
20
+        }
21
+
16 22
         protected override pk_bigserial GetModelFromTCreate(PkBigSerialAddDbo obj)
17 23
         {
18 24
             return GetModelFromTUpdate(obj, new pk_bigserial());

+ 8
- 2
TestUtils/DataAccess/LuUtilsPkGuidDataAccess.cs Wyświetl plik

@@ -4,6 +4,7 @@ using System.Linq.Expressions;
4 4
 using Luticate2.Utils.DataAccess;
5 5
 using Luticate2.Utils.Dbo.Filter;
6 6
 using Luticate2.Utils.Dbo.Result;
7
+using Microsoft.EntityFrameworkCore;
7 8
 using TestUtils.DataAccess.Models;
8 9
 using TestUtils.Dbo.PkGuid;
9 10
 
@@ -11,10 +12,15 @@ namespace TestUtils.DataAccess
11 12
 {
12 13
     public class LuUtilsPkGuidDataAccess : LuEfCrudDataAccess<pk_guid, PkGuidAddDbo, PkGuidDbo, PkGuidAddDbo, LuUtilsDbContext, string>
13 14
     {
14
-        public LuUtilsPkGuidDataAccess(LuUtilsDbContext db) : base(db, db.pk_guid)
15
+        public LuUtilsPkGuidDataAccess(IServiceProvider serviceProvider) : base(serviceProvider)
15 16
         {
16 17
         }
17 18
 
19
+        protected override DbSet<pk_guid> GetTable(LuUtilsDbContext db)
20
+        {
21
+            return db.pk_guid;
22
+        }
23
+
18 24
         protected override pk_guid GetModelFromTCreate(PkGuidAddDbo obj)
19 25
         {
20 26
             return GetModelFromTUpdate(obj, new pk_guid());
@@ -45,7 +51,7 @@ namespace TestUtils.DataAccess
45 51
 
46 52
         public LuResult<bool> SomeTextExists(string someText)
47 53
         {
48
-            return Execute(() => LuResult<bool>.Ok(Table.Any(guid => guid.some_text == someText)));
54
+            return Execute((db, table) => LuResult<bool>.Ok(table.Any(guid => guid.some_text == someText)));
49 55
         }
50 56
     }
51 57
 }

+ 12
- 10
TestUtils/Tests.cs Wyświetl plik

@@ -1,4 +1,6 @@
1 1
 using System;
2
+using Microsoft.EntityFrameworkCore;
3
+using Microsoft.Extensions.DependencyInjection;
2 4
 using TestUtils.DataAccess;
3 5
 
4 6
 namespace TestUtils
@@ -8,17 +10,17 @@ namespace TestUtils
8 10
         public const string ConnectionString =
9 11
             "User ID=dev;Password=dev;Host=localhost;Port=5432;Database=luticate2_utils;Pooling=true;";
10 12
 
11
-        public static LuUtilsDbContext GetDataBaseContext()
13
+        public static void TestRealDb(Action<IServiceProvider> func)
12 14
         {
13
-            return new LuUtilsDbContext(ConnectionString);
14
-        }
15
-
16
-        public static void TestRealDb(Action<LuUtilsDbContext> func)
17
-        {
18
-            var dbContext = GetDataBaseContext();
19
-            dbContext.Database.BeginTransaction();
20
-            func(dbContext);
21
-            dbContext.Database.RollbackTransaction();
15
+            IServiceCollection serviceCollection = new ServiceCollection();
16
+            serviceCollection.AddDbContext<LuUtilsDbContext>(builder => builder.UseNpgsql(ConnectionString),
17
+                ServiceLifetime.Transient);
18
+            var serviceProvider = serviceCollection.BuildServiceProvider();
19
+            var dbContext = (LuUtilsDbContext)serviceProvider.GetService(typeof(LuUtilsDbContext));
20
+            func(serviceProvider);
21
+            dbContext.pk_bigserial.RemoveRange(dbContext.pk_bigserial);
22
+            dbContext.pk_guid.RemoveRange(dbContext.pk_guid);
23
+            dbContext.SaveChanges();
22 24
         }
23 25
     }
24 26
 }

+ 3
- 3
WebApiUtils/Startup.cs Wyświetl plik

@@ -39,8 +39,8 @@ namespace WebApiUtils
39 39
 
40 40
             services.AddLuticateUtils(options => options.Version = "dev");
41 41
 
42
-            services.AddTransient<PkGuidBusiness>();
43
-            services.AddTransient<LuUtilsPkGuidDataAccess>();
42
+            services.AddSingleton<PkGuidBusiness>();
43
+            services.AddSingleton<LuUtilsPkGuidDataAccess>();
44 44
             services.AddDbContext<LuUtilsDbContext>(options =>
45 45
             {
46 46
                 options.UseNpgsql(Configuration.GetConnectionString("default"));
@@ -48,7 +48,7 @@ namespace WebApiUtils
48 48
                     .AddEntityFrameworkNpgsqlLuticate()
49 49
                     .AddEntityFrameworkNpgsql()
50 50
                     .BuildServiceProvider());
51
-            });
51
+            }, ServiceLifetime.Transient);
52 52
 
53 53
             services.AddMvc()
54 54
                 .AddLuticateUtils();

Ładowanie…
Anuluj
Zapisz