### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseClass.cs using System; using Microsoft.Extensions.Logging; using xCommons.Extensions; using xExceptions.Constants; namespace xModels.Base { /// /// a Base class which carry required things as a Father for it's childs ... /// public abstract class XBaseClass { // #region Properties ... /// /// LogTag which Specified for this class ... /// private readonly string LOG_TAG; /// /// logger instance ... /// private readonly ILogger logger; #endregion // #region Constructor ... public XBaseClass (ILoggerFactory loggerFactory) { // // Preparing Log Tag ... LOG_TAG = this.GetType ().Name; // Type classType = this.GetType (); logger = loggerFactory.CreateLogger (classType); } #endregion // #region Protected ... /// /// Extract Prepared Log MEssage ... /// /// /// protected virtual string GetLogMessage (string message) { // // Prepare Log Message ... message = $"{LOG_TAG} => {message}"; return message; } /// /// Logging specific Message ... /// /// /// protected virtual void LogMessage ( string message, LogLevel logLevel = LogLevel.Information ) { // // Validate Args ... if (message.IsNullOrEmpty ()) { throw XException.InvalidArgs .ToException (); } // // Prepare Log Message ... message = GetLogMessage (message); // // Logging Message ... logger.Log ( message: message, logLevel: logLevel ); } /// /// Logging specific Message to Console ... /// /// protected virtual void ConsoleMessage (string message) { // // Validate Args ... if (message.IsNullOrEmpty ()) { throw XException.InvalidArgs .ToException (); } // // Prepare Log Message ... message = GetLogMessage (message); // // Logging Message ... Console.WriteLine (message); } #endregion } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseDescriptor.cs namespace xModels.Base { /// /// Descriptors classes Map required data for creating Entities on Seeding time ... /// this is a Base Descriptor class ... /// public abstract class XBaseDescriptor { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseDto.cs namespace xModels.Base { /// /// DTO - Data Transfer Objects is a kind of classes which Represent Entities ... /// this is base Dto class ... /// public abstract class XBaseDto { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseEntity.cs using System.ComponentModel.DataAnnotations; namespace xModels.Base { /// /// Base Entity Class /// /// public abstract class XBaseEntity { /// /// Entity Id /// /// entity unique id [Key] [Required] public T Id { get; set; } /// /// Provided Soft Delete Behaviour ... /// /// public bool Deleted { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseEntityDto.cs namespace xModels.Base { /// /// Base Entity Related Dto Class ... /// /// public abstract class XBaseEntityDto { /// /// Entity Id /// /// entity unique id public TKey Id { get; set; } /// /// Provided Soft Delete Behaviour ... /// /// public bool Deleted { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseGuidIDEntity.cs using System; namespace xModels.Base { /// /// a BaseEntity Class which has Id of Guid type /// public class XBaseGuidIDEntity : XBaseEntity { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseGuidIDEntityDto.cs using System; namespace xModels.Base { public class XBaseGuidIDEntityDto : XBaseEntityDto { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseIntIDEntity.cs using System.ComponentModel.DataAnnotations; namespace xModels.Base { /// /// a BaseEntity Class which has Id of int type /// public abstract class XBaseIntIDEntity : XBaseEntity { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseIntIDEntityDto.cs namespace xModels.Base { public class XBaseIntIDEntityDto : XBaseEntityDto { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseLongIDEntity.cs namespace xModels.Base { public class XBaseLongIDEntity : XBaseEntity { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseLongIDEntityDto.cs namespace xModels.Base { public class XBaseLongIDEntityDto : XBaseEntityDto { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseRangeRequest.cs using System.Collections.Generic; namespace xModels.Base { /// /// Range Request Classes Carry a List of Objects /// /// public class XBaseRangeRequest { public IEnumerable Items { get; set; } = new HashSet (); } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStorableDto.cs namespace xModels.Base { public abstract class XBaseStorableDto : XBaseDto { public abstract TKey Id { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStorableDtoEventModel.cs namespace xModels.Base { public class XBaseStorableDtoEventModel { public T Model { get; set; } public XBaseStorableDtoEventModel(T model) { Model = model; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStoreEvent.cs using System; using System.Collections.Generic; using System.Reactive.Linq; using System.Reactive.Subjects; using xModels.Interfaces; namespace xModels.Base { public abstract class XBaseStoreEvent : IXBaseStoreEvents where T : XBaseStorableDto { // private readonly ISubject> onAddSubject; private readonly ISubject> onUpdateSubject; private readonly ISubject> onRemoveSubject; // private readonly ISubject>> onAddManySubject; private readonly ISubject>> onUpdateManySubject; private readonly ISubject>> onRemoveManySubject; // public IObservable> OnAddObservable => onAddSubject.AsObservable(); public IObservable> OnUpdateObservable => onUpdateSubject.AsObservable(); public IObservable> OnRemoveObservable => onRemoveSubject.AsObservable(); // public IObservable>> OnAddManyObservable => onAddManySubject.AsObservable(); public IObservable>> OnUpdateManyObservable => onUpdateManySubject.AsObservable(); public IObservable>> OnRemoveManyObservable => onRemoveManySubject.AsObservable(); // protected XBaseStoreEvent() { // onAddSubject = new ReplaySubject>(1); onUpdateSubject = new ReplaySubject>(1); onRemoveSubject = new ReplaySubject>(1); // onAddManySubject = new ReplaySubject>>(1); onUpdateManySubject = new ReplaySubject>>(1); onRemoveManySubject = new ReplaySubject>>(1); } // #region Base Actions ... public void AddEvent(XBaseStorableDtoEventModel model) { onAddSubject.OnNext(model); } public void AddManyEvent(XBaseStorableDtoEventModel> model) { onAddManySubject.OnNext(model); } public void RemoveEvent(XBaseStorableDtoEventModel model) { onRemoveSubject.OnNext(model); } public void RemoveManyEvent(XBaseStorableDtoEventModel> model) { onRemoveManySubject.OnNext(model); } public void UpdateEvent(XBaseStorableDtoEventModel model) { onUpdateSubject.OnNext(model); } public void UpdateManyEvent(XBaseStorableDtoEventModel> model) { onUpdateManySubject.OnNext(model); } #endregion } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStringIDEntity.cs using System; namespace xModels.Base { /// /// a BaseEntity Class which has Id of string type /// public class XBaseStringIDEntity : XBaseEntity { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseStringIDEntityDto.cs namespace xModels.Base { public class XBaseStringIDEntityDto : XBaseEntityDto { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Base\XBaseValueContainer.cs namespace xModels.Base { public class XBaseValueContainer { public T Value { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XBaseIndexedDto.cs using xModels.Base; namespace xModels.Dtos { public class XBaseIndexedDto : XBaseDto { public T Item { get; set; } public TKey Key { get; set; } public TIndex Index { get; set; } } public class XBaseIntIndexedDto : XBaseIndexedDto { } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XDeviceDto.cs using xCommons.Constants; using xModels.Base; namespace xModels.Dtos { public class XDeviceDto : XBaseDto { /// /// Operating System /// /// device operating system identifier public string Os { get; set; } /// /// Operating System Version /// /// which version of operatin system is in use public string OsVersion { get; set; } /// /// Device Browser /// /// the Browser identifier public string Browser { get; set; } /// /// Browser Engine Agent /// /// browser engine Agent public string UserAgent { get; set; } /// /// Type of client Device /// /// represent device type XDeviceType public XDeviceType DeviceType { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XFileDto.cs using System; using System.ComponentModel.DataAnnotations; using xCommons.Constants; using xModels.Base; namespace xModels.Dtos { public partial class XFileDto : XBaseDto { [Required] public string AuthorId { get; set; } public XFileType Type { get; set; } [Required] [StringLength (255)] public string Name { get; set; } [StringLength (255)] public string Thumb { get; set; } [Required] [StringLength (255)] public string Path { get; set; } [StringLength (255)] public string ThumbPath { get; set; } [Required] public DateTime UploadedOn { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XObjectResponseResult.cs namespace xModels.Dtos { /// /// Some Requests Get Object Response Result of Data ... /// public struct XObjectResponseResult { public XObjectResponseResult (T responseObject, string responseText) { this.Object = responseObject; this.Text = responseText; } public T Object { get; } public string Text { get; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XPersonDto.cs using xModels.Base; namespace xModels.Dtos { /// /// Since in Many Cases we have to Retrieve Specified User's Minimal /// Infos for Handle Data Transfering, this Dto is Used ... /// public class XPersonDto : XBaseDto { public string Username { get; set; } public string Firstname { get; set; } public string Lastname { get; set; } public string Avatar { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XQuery.cs using xModels.Base; namespace xModels.Dtos { /// /// Request a Page of Data Based on Query ... /// this can used in every Data Providers ... /// public class XQuery : XBaseDto { /// /// an string for filtering results /// /// public string Filter { get; set; } = null; /// /// determines fully load object with it's relational fields or not /// /// public bool ContainsDetail { get; set; } = false; /// /// specifiy sorting of items /// /// public string SortBy { get; set; } = nameof (XBaseIntIDEntity.Id); /// /// specify sorting direction /// /// public bool IsAscending { get; set; } = true; /// /// specify page number /// /// public int Page { get; set; } = 1; /// /// specify page size /// /// public int PageSize { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XQueryResult.cs using System.Collections.Generic; using xModels.Base; namespace xModels.Dtos { /// /// Result of a Requested Page of Data Based on Query ... /// this can used in every Data Providers ... /// public class XQueryResult : XBaseDto { /// /// a collection of items for a page ... /// /// public IEnumerable Items { get; set; } /// /// Current Page Number ... /// /// public long Page { get; set; } /// /// Current Page Size ... /// /// public long PageSize { get; set; } /// /// Total Pages ... /// /// public long TotalPages { get; set; } /// /// Total Filtered Items Pages Count ... /// /// public int TotalFilteredPages { get; set; } /// /// Total Filtered Items ... /// /// public long TotalFilteredItems { get; set; } /// /// Total Exists Items ... /// /// public long TotalItems { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XResourceDto.cs using System.Collections.Generic; using xModels.Base; namespace xModels.Dtos { public class XLocaleResourceDto : XBaseDto { public string Language { get; set; } public string Value { get; set; } } public class XResourceDto : XBaseDto { public string Resource { get; set; } public IEnumerable Locales { get; set; } = new HashSet(); } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Dtos\XValidateRevisionRequest.cs using System.ComponentModel.DataAnnotations; namespace xModels.Dtos { /// /// in some cases we have to validate a revision of request, this is a model /// which used to request a revision validator ... /// public class XValidateRevisionRequest { [Required] public string Revision { get; set; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Extensions\DIExtensions.cs using Microsoft.Extensions.DependencyInjection; using xCommons.Extensions; using xExceptions.Constants; using xModels.Base; using xModels.Interfaces; namespace xModels.Extensions { public static class DIExtensions { /// /// Register an Specific Store in DI ... /// /// DI service collection ... /// an implementation of inetrface of store ... /// service lifetime /// implementation of TType ... /// an inetrface which implements IXBaseStore /// type of an instance of XBaseStorable /// type of key of StorableItem /// public static void AddXStore ( this IServiceCollection services, TImplementation store, ServiceLifetime lifeTime = ServiceLifetime.Singleton ) where TImplementation : TType where TType : IXBaseStore where TStoreItemDto : XBaseStorableDto { // // Validate Args ... if (store.IsNull ()) { throw XException.InvalidArgs .ToException (); } // // Register Service in DI ... services.Add (new ServiceDescriptor (typeof (TType), typeof (TImplementation), lifeTime)); } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Extensions\XModelExtensions.cs using System.Collections.Generic; using System.Linq; using xCommons.Extensions; using xModels.Dtos; namespace xModels.Extensions { public static class XModelExtensions { /// /// Check to XDevice instance to be same or not /// /// /// /// public static bool IsSameAs(this XDeviceDto source, XDeviceDto dest) { // if (source.IsNull() || dest.IsNull()) { return false; } // var isSame = source.Os.ToNormalString() == dest.Os.ToNormalString() && source.OsVersion.ToNormalString() == dest.OsVersion.ToNormalString() && source.Browser.ToNormalString() == dest.Browser.ToNormalString() && source.UserAgent.ToNormalString() == dest.UserAgent.ToNormalString() && source.DeviceType == dest.DeviceType; // return isSame; } public static IEnumerable AsEnumerable( this IEnumerable> source ) { return source.Select(i => i.Item); } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Interfaces\IXAuditable.cs using System; namespace xModels.Interfaces { /// /// Some times we need to wrap Entities by some logs or audits ... /// this class provide Audit fields for an Auditable Entity ... /// public interface IXAuditable { string UserAgent { get; } string UserIp { get; } DateTime TransactionTime { get; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Interfaces\IXBaseStore.cs using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Threading.Tasks; using xModels.Base; namespace xModels.Interfaces { public interface IXBaseStore where T : XBaseStorableDto { // #region Retrieve ... /// /// Retrieve all Exists Items ... /// /// Task> GetAll (); /// /// Retrieve specific Item by key ... /// /// /// Task Get (TKey key); /// /// retrieve items based on specific condition ... /// /// /// Task> FindMany (Expression> condition); /// /// retrieve item based on specific condition ... /// /// /// Task FindOne (Expression> condition); #endregion // #region Add ... /// /// add specific item to Store ... /// /// /// Task Add (T item); /// /// Add a Collection of Items on Store ... /// /// /// Task AddMany (XBaseRangeRequest items); #endregion // #region Remove ... /// /// Remove an item from store ... /// /// /// Task Remove (T item); /// /// remove an item by it's Key ... /// /// /// Task RemoveByKey (TKey key); /// /// remove a collection of items at once ... /// /// /// Task RemoveMany(XBaseRangeRequest items); #endregion // #region Update ... /// /// Update Exists Item in store ... /// /// /// /// /// /// /// Task Update ( T item, ICollection propertyWhiteList = null, ICollection propertyBlackList = null, ICollection>> propertyValueProviders = null, bool updateWithNullOrEmptyValues = false ); /// /// Update a Collection of Exists Items ... /// /// /// /// /// /// /// Task UpdateMany ( XBaseRangeRequest items, ICollection propertyWhiteList = null, ICollection propertyBlackList = null, ICollection>> propertyValueProviders = null, bool updateWithNullOrEmptyValues = false ); #endregion // #region Exists ... /// /// retrieve item(s) exists based on specific condition ... /// /// /// Task IsExists (Expression> condition); /// /// is exists an item by providing it's key ... /// /// /// Task IsExistsByKey (TKey key); #endregion // #region Count ... /// /// Count Exists items ... /// /// Task Count (); #endregion } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Interfaces\IXBaseStoreEvents.cs using System; using System.Collections.Generic; using xModels.Base; namespace xModels.Interfaces { public interface IXBaseStoreEvents where T : XBaseStorableDto { // void AddEvent(XBaseStorableDtoEventModel model); void UpdateEvent(XBaseStorableDtoEventModel model); void RemoveEvent(XBaseStorableDtoEventModel model); // void AddManyEvent(XBaseStorableDtoEventModel> model); void UpdateManyEvent(XBaseStorableDtoEventModel> model); void RemoveManyEvent(XBaseStorableDtoEventModel> model); // IObservable> OnAddObservable { get; } IObservable> OnUpdateObservable { get; } IObservable> OnRemoveObservable { get; } // IObservable>> OnAddManyObservable { get; } IObservable>> OnUpdateManyObservable { get; } IObservable>> OnRemoveManyObservable { get; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xModels\Providers\XBaseInMemoryStore.cs using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using xCommons.Extensions; using xModels.Base; using xModels.Interfaces; namespace xModels.Providers { public abstract class XBaseInMemoryStore : IXBaseStore where T : XBaseStorableDto { /// /// this is main store of items ... /// /// /// private static ConcurrentBag STORE = new ConcurrentBag(); // private readonly IXBaseStoreEvents events; // #region Constructor ... protected XBaseInMemoryStore( IXBaseStoreEvents events = null ) { this.events = events; } #endregion // #region Retrieve ... /// /// Retrieve all Exists Items ... /// /// public Task> GetAll() { // var result = STORE.AsEnumerable(); return Task.FromResult(result); } /// /// Retrieve specific Item by key ... /// /// /// public Task Get(TKey key) { // return IsExistsByKey(key) .ContinueWith(isExistsTask => { // var isExists = isExistsTask .RunTask(); // if (!isExists) { return null; } // try { var result = STORE .FirstOrDefault(i => GetKey(i).Equals(key)); return result; } catch { return null; } }); } /// /// retrieve items based on specific condition ... /// /// /// public Task> FindMany(Expression> condition) { // // Validate Args ... if (condition.IsNull()) { return Task.FromResult(new List().AsEnumerable()); } // var whereFunc = condition.Compile(); var result = STORE.Where(whereFunc); // return Task.FromResult(result); } /// /// retrieve item based on specific condition ... /// /// /// public Task FindOne(Expression> condition) { // // Validate Args ... if (condition.IsNull()) { return null; } // var whereFunc = condition.Compile(); var result = STORE.FirstOrDefault(whereFunc); // return Task.FromResult(result); } #endregion // #region Add ... /// /// add specific item to Store ... /// /// /// public Task Add(T item) { // // Validate Args ... if (item.IsNull() || GetKey(item).IsNull()) { return Task.FromResult(false); } // // Try to add item ... return IsExistsByKey(GetKey(item)) .ContinueWith(isExistsTask => { // // Check item exists in Store or not ... var isExists = isExistsTask.RunTask(); if (isExists) { return false; } // // Add Item to Store ... STORE.Add(item); OnAdd(item); // return true; }); } /// /// Add a Collection of Items on Store ... /// /// /// public Task AddMany(XBaseRangeRequest items) { // // Validate Args ... if ( items.IsNull() || !items.Items.HasChild() ) { return Task.FromResult(false); } // // Retrieve Must Add Items ... var mustAddItems = items.Items .Where(i => !GetKey(i) .IsNull() && !STORE .Any(si => GetKey(i).Equals(GetKey(si))) ); if (!mustAddItems.HasChild()) { return Task.FromResult(false); } // // Add Items ... try { // mustAddItems .ToList() .ForEach(mi => STORE.Add(mi)); // OnAddMany(mustAddItems); // return Task.FromResult(true); } catch { return Task.FromResult(false); } } #endregion // #region Remove ... /// /// Remove an item from store ... /// /// /// public Task Remove(T item) { // // Validate Args ... if ( item.IsNull() || !STORE .Any(i => GetKey(i) .Equals(GetKey(item))) ) { return Task.FromResult(false); } // try { // RemoveItemFromStore(item); return Task.FromResult(true); } catch { return Task.FromResult(false); } } /// /// remove an item by it's Key ... /// /// /// public Task RemoveByKey(TKey key) { return Get(key) .ContinueWith(getTask => { // // retrieve item by it's Key ... var item = getTask .RunTask(); // // Check item exists ... if (item.IsNull()) { return false; } // // Try to remove item ... var result = false; try { // result = Remove(item) .RunTask(); } catch { result = false; } // return result; }); } /// /// remove a collection of items at once ... /// /// /// public Task RemoveMany(XBaseRangeRequest items) { // // Validate Args ... if ( items.IsNull() || !items.Items.HasChild() ) { return Task.FromResult(false); } // var mustRemovedItems = items.Items .Where(i => STORE .Any(si => GetKey(si).Equals(GetKey(i))) ); if (!mustRemovedItems.HasChild()) { return Task.FromResult(false); } // try { // RemoveItemsFromStore(mustRemovedItems); return Task.FromResult(true); } catch { return Task.FromResult(false); } } #endregion // #region Update ... /// /// Update Exists Item in store ... /// /// /// /// /// /// /// public Task Update( T item, ICollection propertyWhiteList = null, ICollection propertyBlackList = null, ICollection>> propertyValueProviders = null, bool updateWithNullOrEmptyValues = false ) { return Get(GetKey(item)) .ContinueWith(getTask => { // var existsItem = getTask .RunTask(); // // Validate item Exists ... if (existsItem.IsNull()) { return null; } // try { // var updatedItem = existsItem; updatedItem.UpdateData( updateWith: item, propertyWhiteList: propertyWhiteList, propertyBlackList: propertyBlackList, propertyValueProviders: propertyValueProviders, updateWithNullOrEmptyValues: updateWithNullOrEmptyValues, throwExceptionOnFails: true ); // RemoveItemFromStore(existsItem); STORE.Add(updatedItem); OnUpdate(item); // return updatedItem; } catch { return null; } }); } /// /// Update a Collection of Exists Items ... /// /// /// /// /// /// /// public Task UpdateMany( XBaseRangeRequest items, ICollection propertyWhiteList = null, ICollection propertyBlackList = null, ICollection>> propertyValueProviders = null, bool updateWithNullOrEmptyValues = false ) { // // Validate Args ... if ( items.IsNull() || !items.Items.HasChild() ) { return Task.FromResult(false); } // // retrieve must updated items ... var mustUpdateItems = items .Items .Where(i => STORE .Any( si => GetKey(i).Equals(GetKey(si))) ); if (!mustUpdateItems.HasChild()) { return Task.FromResult(false); } // // Do Tasks ... var mustUpdateTasks = mustUpdateItems.Select(i => Update( i, propertyWhiteList: propertyWhiteList, propertyBlackList: propertyBlackList, propertyValueProviders: propertyValueProviders, updateWithNullOrEmptyValues: updateWithNullOrEmptyValues )); return Task.WhenAll(mustUpdateTasks) .ContinueWith(updateTasks => { // var updatedItems = updateTasks .RunTask(); // if (!updatedItems.HasChild()) { return false; } else { // OnUpdateMany(mustUpdateItems); return true; } }); } #endregion // #region Exists ... /// /// retrieve item(s) exists based on specific condition ... /// /// /// public Task IsExists(Expression> condition) { // // Validate Args ... if (condition.IsNull()) { return Task.FromResult(false); } // var whereFunc = condition.Compile(); var result = STORE.Any(whereFunc); // return Task.FromResult(result); } /// /// is exists an item by providing it's key ... /// /// /// public Task IsExistsByKey(TKey key) { return Task.Run(() => { return STORE.Any(i => GetKey(i).Equals(key)); }); } #endregion // #region Count ... /// /// Count Exists items ... /// /// public Task Count() { // var result = STORE.Count(); return Task.FromResult(result); } #endregion // #region Keys ... /// /// set Object Key ... /// /// /// public void SetKey( ref T item, TKey id ) { // var props = item.GetType().GetProperties(); var keyProp = props.FirstOrDefault(p => p.Name == "Id"); if (keyProp.IsNull()) { return; } // Type t = Nullable.GetUnderlyingType(keyProp.PropertyType) ?? keyProp.PropertyType; object safeValue = (id == null) ? null : Convert.ChangeType(id, t); keyProp.SetValue(item, safeValue, null); } /// /// Get Object Key ... /// /// /// public TKey GetKey(T item) { // var props = item.GetType().GetProperties(); var keyProp = props.FirstOrDefault(p => p.Name == "Id"); // var keyString = string.Empty; if (keyProp.IsNull()) { keyString = string.Empty; } else { keyString = keyProp.GetValue(item).ToString(); } // if (keyString.IsNullOrEmpty()) { return default(TKey); } // // Prevent Deserializing issues throug JsonReader ... if (keyString.IsGuid() && typeof(TKey) == typeof(Guid)) { return item.Id; } // TKey result; try { result = keyString.FromJSON(); } catch { result = keyString.ConvertTo(); } return result; } #endregion // #region Private ... private void RemoveItemFromStore(T item) { // STORE = new ConcurrentBag( STORE.Except(new[] { item }) ); // OnRemove(item); } private void RemoveItemsFromStore(IEnumerable items) { // STORE = new ConcurrentBag( STORE.Except(items) ); // OnRemoveMany(items); } // #region Event Notifiers ... private void OnAdd(T item) { // if (!events.IsNull()) { events.AddEvent(new XBaseStorableDtoEventModel(item)); } } private void OnUpdate(T item) { // if (!events.IsNull()) { events.UpdateEvent(new XBaseStorableDtoEventModel(item)); } } private void OnRemove(T item) { // if (!events.IsNull()) { events.RemoveEvent(new XBaseStorableDtoEventModel(item)); } } private void OnAddMany(IEnumerable items) { // if (!events.IsNull()) { events.AddManyEvent(new XBaseStorableDtoEventModel>(items)); } } private void OnUpdateMany(IEnumerable items) { // if (!events.IsNull()) { events.UpdateManyEvent(new XBaseStorableDtoEventModel>(items)); } } private void OnRemoveMany(IEnumerable items) { // if (!events.IsNull()) { events.RemoveManyEvent(new XBaseStorableDtoEventModel>(items)); } } #endregion #endregion } }