diff --git a/AyCode.Core.targets b/AyCode.Core.targets
index fd35ae6..ef6f2a0 100644
--- a/AyCode.Core.targets
+++ b/AyCode.Core.targets
@@ -1,12 +1,17 @@
+
AyCode.Core.targets
+ <_ProjectName>FruitBank
+
+
net9.0
enable
enable
Debug;Release;Product
- bin\FruitBank
+ bin\$(_ProjectName)
\ No newline at end of file
diff --git a/AyCode.Core/Extensions/CollectionExtensions.cs b/AyCode.Core/Extensions/CollectionExtensions.cs
index 4dbdf47..ce87f21 100644
--- a/AyCode.Core/Extensions/CollectionExtensions.cs
+++ b/AyCode.Core/Extensions/CollectionExtensions.cs
@@ -27,6 +27,18 @@ namespace AyCode.Core.Extensions
return source.UpdateCollectionByIndex(index, dataItem, isRemove);
}
+ public static TrackingState UpdateCollectionById(this IList> source, IId dataItem, bool isRemove) where TId : struct
+ {
+ if (source == null) throw new ArgumentNullException(nameof(source), $"source == null");
+
+ var equalityComparer = EqualityComparer.Default;
+ if (equalityComparer.Equals(dataItem.Id, default(TId))) throw new ArgumentNullException(nameof(dataItem), "UpdateCollection->dataItem.Id.IsNullOrEmpty()");
+
+ var index = source.FindIndex(x => equalityComparer.Equals(x.Id, dataItem.Id));
+
+ return source.UpdateCollectionByIndex(index, dataItem, isRemove);
+ }
+
public static TrackingState UpdateCollectionByIndex(this IList source, int index, TDataItem dataItem, bool isRemove)
{
if (isRemove)
diff --git a/AyCode.Services.Server/SignalRs/AcSignalRDataSource.cs b/AyCode.Services.Server/SignalRs/AcSignalRDataSource.cs
index 9d1b870..03235a8 100644
--- a/AyCode.Services.Server/SignalRs/AcSignalRDataSource.cs
+++ b/AyCode.Services.Server/SignalRs/AcSignalRDataSource.cs
@@ -1,43 +1,87 @@
-using System.Collections;
-using System.Collections.ObjectModel;
-using System.Diagnostics;
-using System.Diagnostics.CodeAnalysis;
-using AyCode.Core.Enums;
+using AyCode.Core.Enums;
using AyCode.Core.Extensions;
using AyCode.Core.Helpers;
using AyCode.Core.Interfaces;
using AyCode.Services.SignalRs;
+using System.Collections;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
namespace AyCode.Services.Server.SignalRs
{
- public class TrackingItem(TrackingState trackingState, T currentValue, T? originalValue = null) where T : class, IId
+ //public class TrackingItemGuid(TrackingState trackingState, TDataItem currentValue, TDataItem? originalValue = null) : TrackingItem(trackingState, currentValue, originalValue)
+ // where TDataItem : class, IId { }
+
+ //public class TrackingItemInt(TrackingState trackingState, TDataItem currentValue, TDataItem? originalValue = null) : TrackingItem(trackingState, currentValue, originalValue)
+ // where TDataItem : class, IId {}
+
+ public abstract class TrackingItem(TrackingState trackingState, TDataItem currentValue, TDataItem? originalValue = null) where TDataItem : class, IId where TId : struct
{
public TrackingState TrackingState { get; internal set; } = trackingState;
- public T CurrentValue { get; internal set; } = currentValue;
- public T? OriginalValue { get; init; } = originalValue;
+ public TDataItem CurrentValue { get; internal set; } = currentValue;
+ public TDataItem? OriginalValue { get; init; } = originalValue;
- internal TrackingItem UpdateItem(TrackingState trackingState, T newValue)
+ internal TrackingItem UpdateItem(TrackingState trackingState, TDataItem newValue) //where TTrackingItem : TrackingItem
{
CurrentValue = newValue;
if (TrackingState != TrackingState.Add)
TrackingState = trackingState;
- return this;
+ return (TrackingItem)this;
}
}
+ //public class ChangeTrackingGuid : ChangeTracking /*: IEnumerable>*/ where TDataItem : class, IId
+ //{
+ // protected override bool HasIdValue(TDataItem dataItem) => !dataItem.Id.IsNullOrEmpty();
- public class ChangeTracking /*: IEnumerable>*/ where T : class, IId
+ // protected override int FindIndex(TDataItem newValue) => TrackingItems.FindIndex(x => x.CurrentValue.Id == newValue.Id);
+
+ // public override bool TryGetTrackingItem(Guid id, [NotNullWhen(true)] out TrackingItem? trackingItem)
+ // {
+ // trackingItem = TrackingItems.FirstOrDefault(x => x.CurrentValue.Id == id);
+ // return trackingItem != null;
+ // }
+ //}
+
+ //public class ChangeTrackingInt : ChangeTracking /*: IEnumerable>*/ where TDataItem : class, IId
+ //{
+ // protected override bool HasIdValue(TDataItem dataItem) => true;//dataItem.Id.IsNullOrEmpty();
+
+ // protected override int FindIndex(TDataItem newValue) => TrackingItems.FindIndex(x => x.CurrentValue.Id == newValue.Id);
+
+ // public override bool TryGetTrackingItem(int id, [NotNullWhen(true)] out TrackingItem? trackingItem)
+ // {
+ // trackingItem = TrackingItems.FirstOrDefault(x => x.CurrentValue.Id == id);
+ // return trackingItem != null;
+ // }
+ //}
+
+ public class ChangeTracking /*: IEnumerable>*/where TDataItem : class, IId where TId : struct
{
- private readonly List> _trackingItems = []; //TODO: Dictionary... - J.
+ private readonly EqualityComparer _equalityComparer = EqualityComparer.Default;
+ private readonly List> _trackingItems = []; //TODO: Dictionary... - J.
- internal TrackingItem? AddTrackingItem(TrackingState trackingState, T newValue, T? originalValue = null)
+ //protected abstract bool HasIdValue(TDataItem dataItem);
+ //protected abstract int FindIndex(TDataItem newValue);
+ //public abstract bool TryGetTrackingItem(TId id, [NotNullWhen(true)] out TrackingItem? trackingItem);
+
+ private bool HasIdValue(TDataItem dataItem) => _equalityComparer.Equals(dataItem.Id, default);//dataItem.Id.IsNullOrEmpty();
+ public int FindIndex(TDataItem newValue) => _trackingItems.FindIndex(x => _equalityComparer.Equals(x.CurrentValue.Id, newValue.Id));
+ public bool TryGetTrackingItem(TId id, [NotNullWhen(true)] out TrackingItem? trackingItem)
{
- if (newValue.Id.IsNullOrEmpty()) throw new ArgumentNullException(nameof(newValue), $@"currentValue.Id.IsNullOrEmpty()");
+ trackingItem = _trackingItems.FirstOrDefault(x => _equalityComparer.Equals(x.CurrentValue.Id, id));
+ return trackingItem != null;
+ }
- var itemIndex = _trackingItems.FindIndex(x => x.CurrentValue.Id == newValue.Id);
- TrackingItem? trackingItem = null;
+ internal TrackingItem? AddTrackingItem(TrackingState trackingState, TDataItem newValue, TDataItem? originalValue = null)
+ {
+ if (!HasIdValue(newValue)) throw new ArgumentNullException(nameof(newValue), $@"currentValue.Id.IsNullOrEmpty()");
+
+ var itemIndex = FindIndex(newValue); //_trackingItems.FindIndex(x => x.CurrentValue.Id == newValue.Id);
+ TrackingItem? trackingItem = null;
if (itemIndex > -1)
{
@@ -50,13 +94,13 @@ namespace AyCode.Services.Server.SignalRs
}
return trackingItem.UpdateItem(trackingState, newValue);
-
}
if (originalValue != null && Equals(newValue, originalValue))
originalValue = TrackingItemHelpers.JsonClone(originalValue);
- trackingItem = new TrackingItem(trackingState, newValue, originalValue);
+ //trackingItem = new TrackingItem(trackingState, newValue, originalValue);
+ trackingItem = (TrackingItem)Activator.CreateInstance(typeof(TrackingItem), trackingState, newValue, originalValue)!;
_trackingItems.Add(trackingItem);
return trackingItem;
@@ -64,15 +108,9 @@ namespace AyCode.Services.Server.SignalRs
public int Count => _trackingItems.Count;
internal void Clear() => _trackingItems.Clear();
- public List> ToList() => _trackingItems.ToList();
+ public List> ToList() => _trackingItems.ToList();
- public bool TryGetTrackingItem(Guid id, [NotNullWhen(true)] out TrackingItem? trackingItem)
- {
- trackingItem = _trackingItems.FirstOrDefault(x => x.CurrentValue.Id == id);
- return trackingItem != null;
- }
-
- internal void Remove(TrackingItem trackingItem) => _trackingItems.Remove(trackingItem);
+ internal void Remove(TrackingItem trackingItem) => _trackingItems.Remove(trackingItem);
//public IEnumerator> GetEnumerator()
//{
@@ -85,16 +123,52 @@ namespace AyCode.Services.Server.SignalRs
//}
}
+ //[Serializable]
+ //[DebuggerDisplay("Count = {Count}")]
+ //public abstract class AcSignalRDataSourceGuid : AcSignalRDataSource
+ // where TDataItem : class, IId where TIList : class, IList
+ //{
+ // public AcSignalRDataSourceGuid(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, object[]? contextIds = null)
+ // : base(signalRClient, signalRCrudTags, contextIds)
+ // {
+ // }
+
+ // protected override bool HasIdValue(TDataItem dataItem) => !dataItem.Id.IsNullOrEmpty();
+ // protected override bool IdEquals(Guid id1, Guid id2) => id1 == id2;
+
+ // protected override int FindIndexInnerList(Guid id) => InnerList.FindIndex(x => x.Id == id);
+ // protected override TDataItem? FirstOrDefaultInnerList(Guid id) => InnerList.FirstOrDefault(x => x.Id == id);
+ //}
+
+ //[Serializable]
+ //[DebuggerDisplay("Count = {Count}")]
+ //public abstract class AcSignalRDataSourceInt : AcSignalRDataSource
+ // where TDataItem : class, IId where TIList : class, IList
+ //{
+ // public AcSignalRDataSourceInt(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, object[]? contextIds = null)
+ // : base(signalRClient, signalRCrudTags, contextIds)
+ // {
+ // }
+
+ // protected override bool HasIdValue(TDataItem dataItem) => true;
+ // protected override bool IdEquals(int id1, int id2) => id1 == id2;
+
+ // protected override int FindIndexInnerList(int id) => InnerList.FindIndex(x => x.Id == id);
+ // protected override TDataItem? FirstOrDefaultInnerList(int id) => InnerList.FirstOrDefault(x => x.Id == id);
+ //}
[Serializable]
[DebuggerDisplay("Count = {Count}")]
- public class AcSignalRDataSource : IList, IList, IReadOnlyList where T : class, IId
+ public abstract class AcSignalRDataSource : IList, IList, IReadOnlyList
+ where TDataItem : class, IId where TId : struct
+ where TIList : class, IList
{
private readonly object _syncRoot = new();
+ private readonly EqualityComparer _equalityComparer = EqualityComparer.Default;
- protected List InnerList = []; //TODO: Dictionary??? - J.
- protected readonly ChangeTracking TrackingItems = new();
+ protected TIList InnerList = Activator.CreateInstance();// []; //TODO: Dictionary??? - J.
+ protected readonly ChangeTracking TrackingItems = Activator.CreateInstance>();
public object[]? ContextIds;
public string? FilterText { get; set; }
@@ -102,9 +176,19 @@ namespace AyCode.Services.Server.SignalRs
public AcSignalRClientBase SignalRClient;
protected readonly SignalRCrudTags SignalRCrudTags;
- public Func, Task>? OnDataSourceItemChanged;
+ public Func, Task>? OnDataSourceItemChanged;
public Func? OnDataSourceLoaded;
+ //protected abstract bool HasIdValue(TDataItem dataItem);
+ //protected abstract bool IdEquals(TId id1, TId id2);
+ //protected abstract int FindIndexInnerList(TId id);
+ //protected abstract TDataItem? FirstOrDefaultInnerList(TId id);
+
+ protected bool HasIdValue(TDataItem dataItem) => _equalityComparer.Equals(dataItem.Id, default);//dataItem.Id.IsNullOrEmpty();
+ protected bool IdEquals(TId id1, TId id2) => _equalityComparer.Equals(id1, id2);
+ protected int FindIndexInnerList(TId id) => InnerList.FindIndex(x => IdEquals(x.Id, id));
+ protected TDataItem? FirstOrDefaultInnerList(TId id) => InnerList.FirstOrDefault(x => IdEquals(x.Id, id));
+
public AcSignalRDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, object[]? contextIds = null)
{
//if (contextIds != null) (ContextIds = new List