2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2025-05-06 11:32:59 +00:00
This commit is contained in:
Ahmed Zamil 2020-12-11 01:17:15 +03:00
parent c68b58c3a2
commit b61df304ea
9 changed files with 110 additions and 42 deletions

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.1</TargetFramework>
<AssemblyName>Esiur.Stores.EntityCore</AssemblyName> <AssemblyName>Esiur.Stores.EntityCore</AssemblyName>
<Authors>Ahmed Kh. Zamil</Authors> <Authors>Ahmed Kh. Zamil</Authors>
<Company>Esiur Foundation</Company> <Company>Esiur Foundation</Company>
@ -12,7 +12,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.0" />
<PackageReference Include="System.Collections" Version="4.3.0" /> <PackageReference Include="System.Collections" Version="4.3.0" />
</ItemGroup> </ItemGroup>

View File

@ -49,7 +49,7 @@ namespace Esiur.Stores.EntityCore
public ConventionSet ModifyConventions(ConventionSet conventionSet) public ConventionSet ModifyConventions(ConventionSet conventionSet)
{ {
var extension = _options.FindExtension<EsiurExtensionOptions>(); var extension = _options.FindExtension<EsiurExtensionOptions>();
conventionSet.ModelFinalizedConventions.Add(new EsiurProxyRewrite( conventionSet.ModelFinalizingConventions.Add(new EsiurProxyRewrite(
extension, extension,
_conventionSetBuilderDependencies)); _conventionSetBuilderDependencies));
return conventionSet; return conventionSet;

View File

@ -40,7 +40,7 @@ using Microsoft.EntityFrameworkCore.Metadata.Internal;
namespace Esiur.Stores.EntityCore namespace Esiur.Stores.EntityCore
{ {
public class EsiurProxyRewrite : IModelFinalizedConvention public class EsiurProxyRewrite : IModelFinalizingConvention
{ {
private static readonly MethodInfo _createInstance private static readonly MethodInfo _createInstance
= typeof(EsiurProxyRewrite).GetTypeInfo().GetDeclaredMethod(nameof(EsiurProxyRewrite.CreateInstance)); = typeof(EsiurProxyRewrite).GetTypeInfo().GetDeclaredMethod(nameof(EsiurProxyRewrite.CreateInstance));
@ -94,7 +94,7 @@ namespace Esiur.Stores.EntityCore
} }
public void ProcessModelFinalized(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context) public void ProcessModelFinalizing(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context)
{ {
foreach (var entityType in modelBuilder.Metadata.GetEntityTypes()) foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
{ {
@ -106,7 +106,7 @@ namespace Esiur.Stores.EntityCore
var binding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding]; var binding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding];
#pragma warning restore EF1001 // Internal EF Core API usage. #pragma warning restore EF1001 // Internal EF Core API usage.
if (binding == null) if (binding == null)
_directBindingConvention.ProcessModelFinalized(modelBuilder, context); _directBindingConvention.ProcessModelFinalizing(modelBuilder, context);
#pragma warning disable EF1001 // Internal EF Core API usage. #pragma warning disable EF1001 // Internal EF Core API usage.
binding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding]; binding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding];
@ -145,5 +145,7 @@ namespace Esiur.Stores.EntityCore
} }
} }
} }
} }

View File

@ -1,8 +1,7 @@
{ {
"profiles": { "profiles": {
"Esiur.Stores.EntityCore": { "Esiur.Stores.EntityCore": {
"commandName": "Project", "commandName": "Project"
"commandLineArgs": "--migrate"
} }
} }
} }

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.1</TargetFramework>
<Authors>Ahmed Kh. Zamil</Authors> <Authors>Ahmed Kh. Zamil</Authors>
<Company>Esiur</Company> <Company>Esiur</Company>
<Product>Esiur MongoDB Store</Product> <Product>Esiur MongoDB Store</Product>

View File

@ -62,17 +62,20 @@ namespace Esiur.Data
public void Sort() public void Sort()
{ {
lock(syncRoot)
list.Sort(); list.Sort();
} }
public void Sort(IComparer<T> comparer) public void Sort(IComparer<T> comparer)
{ {
list.Sort(comparer); lock (syncRoot)
list.Sort(comparer);
} }
public void Sort(Comparison<T> comparison) public void Sort(Comparison<T> comparison)
{ {
list.Sort(comparison); lock (syncRoot)
list.Sort(comparison);
} }
public IEnumerable<T> Where(Func<T, bool> predicate) public IEnumerable<T> Where(Func<T, bool> predicate)

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.1</TargetFramework>
<Description>Distributed Resources Platform</Description> <Description>Distributed Resources Platform</Description>
<Copyright>Ahmed Kh. Zamil</Copyright> <Copyright>Ahmed Kh. Zamil</Copyright>
<PackageLicenseUrl>https://github.com/Esiur/Esiur-dotnet/blob/master/LICENSE</PackageLicenseUrl> <PackageLicenseUrl>https://github.com/Esiur/Esiur-dotnet/blob/master/LICENSE</PackageLicenseUrl>
@ -52,7 +52,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="System.Diagnostics.StackTrace" Version="4.3.0" /> <PackageReference Include="System.Diagnostics.StackTrace" Version="4.3.0" />
<PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" /> <PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" />
<PackageReference Include="System.Interactive.Async" Version="4.1.1" /> <PackageReference Include="System.Interactive.Async" Version="5.0.0" />
<PackageReference Include="System.Net.NameResolution" Version="4.3.0" /> <PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
<PackageReference Include="System.Net.NetworkInformation" Version="4.3.0" /> <PackageReference Include="System.Net.NetworkInformation" Version="4.3.0" />
<PackageReference Include="System.Net.Security" Version="4.3.2" /> <PackageReference Include="System.Net.Security" Version="4.3.2" />

View File

@ -62,9 +62,6 @@ namespace Esiur.Net.IIP
Session session; Session session;
List<IResource> attachedResources = new List<IResource>();
AsyncReply<bool> openReply; AsyncReply<bool> openReply;
byte[] localPasswordOrToken; byte[] localPasswordOrToken;
@ -291,8 +288,8 @@ namespace Esiur.Net.IIP
void init() void init()
{ {
var q = queue; //var q = queue;
q.Then((x) => queue.Then((x) =>
{ {
if (x.Type == DistributedResourceQueueItem.DistributedResourceQueueItemType.Event) if (x.Type == DistributedResourceQueueItem.DistributedResourceQueueItemType.Event)
x.Resource._EmitEventByIndex(x.Index, (object[])x.Value); x.Resource._EmitEventByIndex(x.Index, (object[])x.Value);
@ -308,6 +305,7 @@ namespace Esiur.Net.IIP
public override void Destroy() public override void Destroy()
{ {
UnsubscribeAll();
this.OnReady = null; this.OnReady = null;
this.OnError = null; this.OnError = null;
base.Destroy(); base.Destroy();
@ -1146,13 +1144,14 @@ namespace Esiur.Net.IIP
Server?.Membership.Logout(session); Server?.Membership.Logout(session);
Warehouse.Remove(this); Warehouse.Remove(this);
ready = false; ready = false;
UnsubscribeAll();
} }
} }
/* /*
public AsyncBag<T> Children<T>(IResource resource) public AsyncBag<T> Children<T>(IResource resource)
{ {
if (Codec.IsLocalResource(resource, this)) if (Codec.IsLocalReso turce(resource, this))
return (resource as DistributedResource).children.Where(x => x.GetType() == typeof(T)).Select(x => (T)x); return (resource as DistributedResource).children.Where(x => x.GetType() == typeof(T)).Select(x => (T)x);
return null; return null;

View File

@ -54,6 +54,9 @@ namespace Esiur.Net.IIP
volatile uint callbackCounter = 0; volatile uint callbackCounter = 0;
List<IResource> subscriptions = new List<IResource>();
object subscriptionsLock = new object();
AsyncQueue<DistributedResourceQueueItem> queue = new AsyncQueue<DistributedResourceQueueItem>(); AsyncQueue<DistributedResourceQueueItem> queue = new AsyncQueue<DistributedResourceQueueItem>();
/// <summary> /// <summary>
@ -459,10 +462,14 @@ namespace Esiur.Net.IIP
var r = res as IResource; var r = res as IResource;
// unsubscribe // unsubscribe
r.Instance.ResourceEventOccurred -= Instance_EventOccurred; Unsubscribe(r);
r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
r.Instance.ResourceModified -= Instance_PropertyModified; //r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed; //r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
//r.Instance.ResourceModified -= Instance_PropertyModified;
//r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
// r.Instance.Children.OnAdd -= Children_OnAdd; // r.Instance.Children.OnAdd -= Children_OnAdd;
// r.Instance.Children.OnRemoved -= Children_OnRemoved; // r.Instance.Children.OnRemoved -= Children_OnRemoved;
@ -471,7 +478,7 @@ namespace Esiur.Net.IIP
// Console.WriteLine("Attach {0} {1}", r.Instance.Link, r.Instance.Id); // Console.WriteLine("Attach {0} {1}", r.Instance.Link, r.Instance.Id);
// add it to attached resources so GC won't remove it from memory // add it to attached resources so GC won't remove it from memory
attachedResources.Add(r); ///attachedResources.Add(r);
var link = DC.ToBytes(r.Instance.Link); var link = DC.ToBytes(r.Instance.Link);
@ -501,10 +508,13 @@ namespace Esiur.Net.IIP
// subscribe // subscribe
r.Instance.ResourceEventOccurred += Instance_EventOccurred; //r.Instance.ResourceEventOccurred += Instance_EventOccurred;
r.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred; //r.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred;
r.Instance.ResourceModified += Instance_PropertyModified; //r.Instance.ResourceModified += Instance_PropertyModified;
r.Instance.ResourceDestroyed += Instance_ResourceDestroyed; //r.Instance.ResourceDestroyed += Instance_ResourceDestroyed;
Subscribe(r);
//r.Instance.Children.OnAdd += Children_OnAdd; //r.Instance.Children.OnAdd += Children_OnAdd;
//r.Instance.Children.OnRemoved += Children_OnRemoved; //r.Instance.Children.OnRemoved += Children_OnRemoved;
@ -582,20 +592,25 @@ namespace Esiur.Net.IIP
{ {
var r = res as IResource; var r = res as IResource;
// unsubscribe // unsubscribe
r.Instance.ResourceEventOccurred -= Instance_EventOccurred; Unsubscribe(r);
r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
r.Instance.ResourceModified -= Instance_PropertyModified; //r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed; //r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
//r.Instance.ResourceModified -= Instance_PropertyModified;
//r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
//r.Instance.Children.OnAdd -= Children_OnAdd; //r.Instance.Children.OnAdd -= Children_OnAdd;
//r.Instance.Children.OnRemoved -= Children_OnRemoved; //r.Instance.Children.OnRemoved -= Children_OnRemoved;
//r.Instance.Attributes.OnModified -= Attributes_OnModified; //r.Instance.Attributes.OnModified -= Attributes_OnModified;
// subscribe // subscribe
r.Instance.ResourceEventOccurred += Instance_EventOccurred; //r.Instance.ResourceEventOccurred += Instance_EventOccurred;
r.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred; //r.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred;
r.Instance.ResourceModified += Instance_PropertyModified; //r.Instance.ResourceModified += Instance_PropertyModified;
r.Instance.ResourceDestroyed += Instance_ResourceDestroyed; //r.Instance.ResourceDestroyed += Instance_ResourceDestroyed;
Subscribe(r);
//r.Instance.Children.OnAdd += Children_OnAdd; //r.Instance.Children.OnAdd += Children_OnAdd;
//r.Instance.Children.OnRemoved += Children_OnRemoved; //r.Instance.Children.OnRemoved += Children_OnRemoved;
@ -621,14 +636,16 @@ namespace Esiur.Net.IIP
{ {
if (res != null) if (res != null)
{ {
var r = res as IResource; //var r = res as IResource;
r.Instance.ResourceEventOccurred -= Instance_EventOccurred; //r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred; //r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
r.Instance.ResourceModified -= Instance_PropertyModified; //r.Instance.ResourceModified -= Instance_PropertyModified;
r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed; //r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
Unsubscribe(res);
// remove from attached resources // remove from attached resources
attachedResources.Remove(res); //attachedResources.Remove(res);
// reply ok // reply ok
SendReply(IIPPacket.IIPPacketAction.DetachResource, callback).Done(); SendReply(IIPPacket.IIPPacketAction.DetachResource, callback).Done();
@ -2190,12 +2207,60 @@ namespace Esiur.Net.IIP
return reply; return reply;
} }
private void Subscribe(IResource resource)
{
lock (subscriptionsLock)
{
resource.Instance.ResourceEventOccurred += Instance_EventOccurred;
resource.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred;
resource.Instance.ResourceModified += Instance_PropertyModified;
resource.Instance.ResourceDestroyed += Instance_ResourceDestroyed;
subscriptions.Add(resource);
}
}
private void Unsubscribe(IResource resource)
{
lock (subscriptionsLock)
{
// do something with the list...
resource.Instance.ResourceEventOccurred -= Instance_EventOccurred;
resource.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
resource.Instance.ResourceModified -= Instance_PropertyModified;
resource.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
subscriptions.Remove(resource);
}
}
private void UnsubscribeAll()
{
lock(subscriptionsLock)
{
foreach(var resource in subscriptions)
{
resource.Instance.ResourceEventOccurred -= Instance_EventOccurred;
resource.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
resource.Instance.ResourceModified -= Instance_PropertyModified;
resource.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
}
subscriptions.Clear();
}
}
private void Instance_ResourceDestroyed(IResource resource) private void Instance_ResourceDestroyed(IResource resource)
{ {
Unsubscribe(resource);
// compose the packet // compose the packet
SendEvent(IIPPacket.IIPPacketEvent.ResourceDestroyed) SendEvent(IIPPacket.IIPPacketEvent.ResourceDestroyed)
.AddUInt32(resource.Instance.Id) .AddUInt32(resource.Instance.Id)
.Done(); .Done();
} }
private void Instance_PropertyModified(IResource resource, string name, object newValue) private void Instance_PropertyModified(IResource resource, string name, object newValue)