using Infrastructure.Application; using Infrastructure.Data; using Infrastructure.Domain; using Infrastructure.Events; using Infrastructure.Extensions; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; namespace IoT.Shared.Services { public class DataService { private readonly IServiceProvider _services; public DataService(IServiceProvider services) { this._services = services; } public void UpdateList(string message, Expression> predicate) where T : BaseEntity { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetService>(); var list = message.FromJson>(); var entities = repo.Table().Where(predicate).Where(o => !list.Contains(o.Id)).ToList(); foreach (var entity in entities) { repo.Delete(entity); if (repo.SaveChanges() > 0) { var eventPublisher = scope.ServiceProvider.GetService(); eventPublisher.Publish(new EntityDeletedEvent(entity)); } } } #region private public void Update(string message) where T : BaseEntity { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetService>(); var model = message.FromJson(); var entity = repo.Table().FirstOrDefault(o => o.Id == model.Id); var isNew = false; if (entity == null) { entity = Activator.CreateInstance(); repo.Add(entity); isNew = true; } entity.From(model); if (repo.SaveChanges() > 0) { var eventPublisher = scope.ServiceProvider.GetService(); if (isNew) { eventPublisher.Publish(new EntityInsertedEvent(entity)); } else { eventPublisher.Publish(new EntityUpdatedEvent(entity)); } } } public T Edit(TEditModel model) where T : BaseEntity where TEditModel : EditModel { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetService>(); var entity = repo.Table().FirstOrDefault(o => o.Id == model.Id); var isNew = false; if (entity == null) { entity = Activator.CreateInstance(); repo.Add(entity); isNew = true; } entity.From(model); if (repo.SaveChanges() > 0) { var eventPublisher = scope.ServiceProvider.GetService(); if (isNew) { eventPublisher.Publish(new EntityInsertedEvent(entity)); } else { eventPublisher.Publish(new EntityUpdatedEvent(entity)); } } return entity; } public void Delete(TEditModel model) where T : BaseEntity where TEditModel : EditModel { try { using var scope = this._services.CreateScope(); var repo = scope.ServiceProvider.GetService>(); var entity = repo.Table().FirstOrDefault(o => o.Id == model.Id); if (entity != null) { repo.Delete(entity); if (repo.SaveChanges() > 0) { var eventPublisher = scope.ServiceProvider.GetService(); eventPublisher.Publish(new EntityDeletedEvent(entity)); } } } catch (Exception ex) { ex.PrintStack(); } } #endregion private } }