mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2025-05-06 11:32:59 +00:00
EF Core
This commit is contained in:
parent
836a1fdeae
commit
443623d8df
@ -36,6 +36,9 @@ namespace Esyur.Stores.EntityCore
|
|||||||
{
|
{
|
||||||
public class EntityResource : IResource
|
public class EntityResource : IResource
|
||||||
{
|
{
|
||||||
|
[NotMapped]
|
||||||
|
internal int _PrimaryId;
|
||||||
|
|
||||||
public event DestroyedEvent OnDestroy;
|
public event DestroyedEvent OnDestroy;
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
|
||||||
|
@ -45,7 +45,9 @@ namespace Esyur.Stores.EntityCore
|
|||||||
|
|
||||||
public event DestroyedEvent OnDestroy;
|
public event DestroyedEvent OnDestroy;
|
||||||
|
|
||||||
struct TypeInfo
|
Dictionary<Type, Dictionary<int, WeakReference>> DB = new Dictionary<Type, Dictionary<int, WeakReference>>();
|
||||||
|
|
||||||
|
internal struct TypeInfo
|
||||||
{
|
{
|
||||||
public string Name;
|
public string Name;
|
||||||
public IEntityType Type;
|
public IEntityType Type;
|
||||||
@ -53,55 +55,57 @@ namespace Esyur.Stores.EntityCore
|
|||||||
}
|
}
|
||||||
|
|
||||||
Dictionary<string, TypeInfo> TypesByName = new Dictionary<string, TypeInfo>();
|
Dictionary<string, TypeInfo> TypesByName = new Dictionary<string, TypeInfo>();
|
||||||
Dictionary<Type, TypeInfo> TypesByType = new Dictionary<Type, TypeInfo>();
|
internal Dictionary<Type, TypeInfo> TypesByType = new Dictionary<Type, TypeInfo>();
|
||||||
|
|
||||||
/*
|
|
||||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
|
||||||
{
|
|
||||||
var extension = optionsBuilder.Options.FindExtension<EsyurExtension>()
|
|
||||||
?? new EsyurExtension();
|
|
||||||
|
|
||||||
|
|
||||||
((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension);
|
|
||||||
//optionsBuilder.UseLazyLoadingProxies();
|
|
||||||
base.OnConfiguring(optionsBuilder);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
||||||
{
|
|
||||||
//modelBuilder.Entity<Series>().ToTable("Series");
|
|
||||||
//modelBuilder.Entity<Episode>().ToTable("Episodes").;
|
|
||||||
//modelBuilder.Ignore<Entit>
|
|
||||||
// modelBuilder.Entity<Series>(x=>x.Property(p=>p.Instance).HasConversion(v=>v.Managers.)
|
|
||||||
Console.WriteLine("OnModelCreating");
|
|
||||||
//modelBuilder.Entity()
|
|
||||||
|
|
||||||
|
|
||||||
base.OnModelCreating(modelBuilder);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
bool Loaded;
|
||||||
|
|
||||||
public async AsyncReply<IResource> Get(string path)
|
public async AsyncReply<IResource> Get(string path)
|
||||||
{
|
{
|
||||||
var p = path.Split('/');
|
var p = path.Split('/');
|
||||||
var ti = TypesByName[p[0]];
|
var ti = TypesByName[p[0]];
|
||||||
var id = Convert.ToInt32(p[1]);
|
var id = Convert.ToInt32(p[1]);
|
||||||
return DbContext.Find(ti.Type.ClrType, id) as IResource;
|
return DbContextProvider().Find(ti.Type.ClrType, id) as IResource;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async AsyncReply<bool> Put(IResource resource)
|
public async AsyncReply<bool> Put(IResource resource)
|
||||||
{
|
{
|
||||||
|
if (resource is EntityStore)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var type = ResourceProxy.GetBaseType(resource);//.GetType().;
|
||||||
|
|
||||||
|
var eid = (resource as EntityResource)._PrimaryId;// (int)resource.Instance.Variables["eid"];
|
||||||
|
|
||||||
|
if (DB[type].ContainsKey(eid))
|
||||||
|
DB[type].Remove(eid);
|
||||||
|
|
||||||
|
DB[type].Add(eid, new WeakReference(resource));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IResource GetById(Type type, int id)
|
||||||
|
{
|
||||||
|
if (!DB[type].ContainsKey(id))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (!DB[type][id].IsAlive)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return DB[type][id].Target as IResource;
|
||||||
|
}
|
||||||
|
|
||||||
[Attribute]
|
[Attribute]
|
||||||
public EsyurExtensionOptions Options { get; set; }
|
public Func<DbContext> DbContextProvider { get; set; }
|
||||||
|
|
||||||
|
[Attribute]
|
||||||
|
public DbContextOptionsBuilder Options { get; set; }
|
||||||
|
|
||||||
//DbContext dbContext;
|
//DbContext dbContext;
|
||||||
[Attribute]
|
//[Attribute]
|
||||||
public DbContext DbContext { get; set; }
|
//public DbContext DbContext { get; set; }
|
||||||
|
|
||||||
public string Link(IResource resource)
|
public string Link(IResource resource)
|
||||||
{
|
{
|
||||||
@ -178,9 +182,15 @@ namespace Esyur.Stores.EntityCore
|
|||||||
|
|
||||||
public AsyncReply<bool> Trigger(ResourceTrigger trigger)
|
public AsyncReply<bool> Trigger(ResourceTrigger trigger)
|
||||||
{
|
{
|
||||||
if (trigger == ResourceTrigger.SystemInitialized && DbContext != null)
|
if (trigger == ResourceTrigger.Initialize)// SystemInitialized && DbContext != null)
|
||||||
{
|
{
|
||||||
var types = DbContext.Model.GetEntityTypes();
|
|
||||||
|
if (DbContextProvider == null)
|
||||||
|
DbContextProvider = () => Activator.CreateInstance(Options.Options.ContextType, Options.Options) as DbContext;
|
||||||
|
|
||||||
|
var context = Activator.CreateInstance(Options.Options.ContextType, Options.Options) as DbContext;
|
||||||
|
|
||||||
|
var types = context.Model.GetEntityTypes();
|
||||||
foreach (var t in types)
|
foreach (var t in types)
|
||||||
{
|
{
|
||||||
var ti = new TypeInfo()
|
var ti = new TypeInfo()
|
||||||
@ -192,6 +202,8 @@ namespace Esyur.Stores.EntityCore
|
|||||||
|
|
||||||
TypesByName.Add(t.ClrType.Name, ti);
|
TypesByName.Add(t.ClrType.Name, ti);
|
||||||
TypesByType.Add(t.ClrType, ti);
|
TypesByType.Add(t.ClrType, ti);
|
||||||
|
|
||||||
|
DB.Add(t.ClrType, new Dictionary<int, WeakReference>());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,14 +11,14 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Marten" Version="3.10.0" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.3" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="3.1.3" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="3.1.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.3">
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.1">
|
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.1.2" />
|
<PackageReference Include="Npgsql" Version="4.1.3.1" />
|
||||||
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.3" />
|
||||||
<PackageReference Include="System.Collections" Version="4.3.0" />
|
<PackageReference Include="System.Collections" Version="4.3.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@ namespace Esyur.Stores.EntityCore
|
|||||||
|
|
||||||
public EntityStore Store => _store;
|
public EntityStore Store => _store;
|
||||||
|
|
||||||
|
|
||||||
public void ApplyServices(IServiceCollection services)
|
public void ApplyServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddEntityFrameworkProxies();
|
services.AddEntityFrameworkProxies();
|
||||||
|
@ -60,11 +60,11 @@ namespace Esyur.Stores.EntityCore
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static DbContextOptionsBuilder UseEsyur(this DbContextOptionsBuilder optionsBuilder,
|
public static DbContextOptionsBuilder UseEsyur(this DbContextOptionsBuilder optionsBuilder,
|
||||||
DbContext context,
|
//DbContext context,
|
||||||
string name = null,
|
string name = null,
|
||||||
IResource parent = null,
|
IResource parent = null,
|
||||||
IPermissionsManager manager = null
|
IPermissionsManager manager = null,
|
||||||
|
Func<DbContext> dbContextProvider = null
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var extension = optionsBuilder.Options.FindExtension<EsyurExtensionOptions>();
|
var extension = optionsBuilder.Options.FindExtension<EsyurExtensionOptions>();
|
||||||
@ -72,10 +72,10 @@ namespace Esyur.Stores.EntityCore
|
|||||||
if (extension == null)
|
if (extension == null)
|
||||||
{
|
{
|
||||||
|
|
||||||
var store = Warehouse.New<EntityStore>(name, null, parent, manager);
|
var store = Warehouse.New<EntityStore>(name, null, parent, manager, new { Options = optionsBuilder, DbContextProvider = dbContextProvider });
|
||||||
extension = new EsyurExtensionOptions(store);
|
extension = new EsyurExtensionOptions(store);
|
||||||
store.Options = extension;
|
//store.Options = optionsBuilder;
|
||||||
store.DbContext = context;
|
//store.DbContext = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension);
|
((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension);
|
||||||
@ -86,10 +86,11 @@ namespace Esyur.Stores.EntityCore
|
|||||||
|
|
||||||
public static DbContextOptionsBuilder<TContext> UseEsyur<TContext>(
|
public static DbContextOptionsBuilder<TContext> UseEsyur<TContext>(
|
||||||
this DbContextOptionsBuilder<TContext> optionsBuilder,
|
this DbContextOptionsBuilder<TContext> optionsBuilder,
|
||||||
DbContext context,
|
//DbContext context,
|
||||||
string name = null,
|
string name = null,
|
||||||
IResource parent = null,
|
IResource parent = null,
|
||||||
IPermissionsManager manager = null)
|
IPermissionsManager manager = null,
|
||||||
|
Func<DbContext> dbContextProvider = null)
|
||||||
where TContext : DbContext
|
where TContext : DbContext
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -98,10 +99,11 @@ namespace Esyur.Stores.EntityCore
|
|||||||
|
|
||||||
if (extension == null)
|
if (extension == null)
|
||||||
{
|
{
|
||||||
var store = Warehouse.New<EntityStore>(name, null, parent, manager);
|
var store = Warehouse.New<EntityStore>(name, null, parent, manager, new { Options = optionsBuilder, DbContextProvider = dbContextProvider });
|
||||||
extension = new EsyurExtensionOptions(store);
|
extension = new EsyurExtensionOptions(store);
|
||||||
store.Options = extension;
|
//store.Options = optionsBuilder;
|
||||||
store.DbContext = context;
|
//store.Options = extension;
|
||||||
|
//store.DbContext = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,10 +24,12 @@ SOFTWARE.
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Esyur.Proxy;
|
using Esyur.Proxy;
|
||||||
using Esyur.Resource;
|
using Esyur.Resource;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
using Microsoft.EntityFrameworkCore.Internal;
|
using Microsoft.EntityFrameworkCore.Internal;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
@ -48,32 +50,30 @@ namespace Esyur.Stores.EntityCore
|
|||||||
public static object CreateInstance(
|
public static object CreateInstance(
|
||||||
IDbContextOptions dbContextOptions,
|
IDbContextOptions dbContextOptions,
|
||||||
IEntityType entityType,
|
IEntityType entityType,
|
||||||
ILazyLoader loader,
|
// ILazyLoader loader,
|
||||||
object[] constructorArguments)
|
object[] constructorArguments,
|
||||||
|
DbContext context,
|
||||||
|
int id = 0
|
||||||
|
)
|
||||||
{
|
{
|
||||||
var options = dbContextOptions.FindExtension<EsyurExtensionOptions>();
|
var options = dbContextOptions.FindExtension<EsyurExtensionOptions>();
|
||||||
|
|
||||||
return CreateInstance2(
|
|
||||||
options,
|
|
||||||
entityType,
|
|
||||||
loader,
|
|
||||||
constructorArguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static object CreateInstance2(
|
|
||||||
EsyurExtensionOptions options,
|
|
||||||
IEntityType entityType,
|
|
||||||
ILazyLoader loader,
|
|
||||||
object[] constructorArguments)
|
|
||||||
{
|
|
||||||
//var key = entityType.FindPrimaryKey();
|
|
||||||
//options.AddType(entityType);
|
|
||||||
|
|
||||||
var manager = options.Store.Instance.Managers.Count > 0 ? options.Store.Instance.Managers.First() : null;
|
var manager = options.Store.Instance.Managers.Count > 0 ? options.Store.Instance.Managers.First() : null;
|
||||||
return Warehouse.New(entityType.ClrType, "", options.Store, null, manager);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
var cache = options.Store.GetById(entityType.ClrType, id);
|
||||||
|
|
||||||
|
if (cache != null)
|
||||||
|
return cache;
|
||||||
|
|
||||||
|
// check if the object exists
|
||||||
|
var obj = Warehouse.New(entityType.ClrType) as EntityResource;//, "", options.Store, null, manager);
|
||||||
|
obj._PrimaryId = id;
|
||||||
|
options.Store.TypesByType[entityType.ClrType].PrimaryKey.SetValue(obj, id);
|
||||||
|
Warehouse.Put(obj, id.ToString(), options.Store, null, null, 0, manager);
|
||||||
|
|
||||||
|
// obj.Instance.IntVal = id;//.Variables.Add("eid", id);
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public EsyurProxyRewrite(EsyurExtensionOptions ext, ProviderConventionSetBuilderDependencies conventionSetBuilderDependencies)
|
public EsyurProxyRewrite(EsyurExtensionOptions ext, ProviderConventionSetBuilderDependencies conventionSetBuilderDependencies)
|
||||||
@ -82,6 +82,7 @@ namespace Esyur.Stores.EntityCore
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void ProcessModelFinalized(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context)
|
public void ProcessModelFinalized(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context)
|
||||||
{
|
{
|
||||||
foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
|
foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
|
||||||
@ -108,8 +109,10 @@ namespace Esyur.Stores.EntityCore
|
|||||||
{
|
{
|
||||||
new DependencyInjectionParameterBinding(typeof(IDbContextOptions), typeof(IDbContextOptions)),
|
new DependencyInjectionParameterBinding(typeof(IDbContextOptions), typeof(IDbContextOptions)),
|
||||||
new EntityTypeParameterBinding(),
|
new EntityTypeParameterBinding(),
|
||||||
new DependencyInjectionParameterBinding(typeof(ILazyLoader), typeof(ILazyLoader)),
|
//new DependencyInjectionParameterBinding(typeof(ILazyLoader), typeof(ILazyLoader)),
|
||||||
new ObjectArrayParameterBinding(binding.ParameterBindings)
|
new ObjectArrayParameterBinding(binding.ParameterBindings),
|
||||||
|
new ContextParameterBinding(typeof(DbContext)),
|
||||||
|
new PropertyParameterBinding(entityType.FindPrimaryKey().Properties.FirstOrDefault())
|
||||||
},
|
},
|
||||||
proxyType));
|
proxyType));
|
||||||
}
|
}
|
||||||
|
@ -50,12 +50,12 @@
|
|||||||
<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="3.2.0" />
|
<PackageReference Include="System.Interactive.Async" Version="4.1.1" />
|
||||||
<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.1" />
|
<PackageReference Include="System.Net.Security" Version="4.3.2" />
|
||||||
<PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
|
<PackageReference Include="System.Reflection.Emit" Version="4.7.0" />
|
||||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" />
|
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
@ -460,6 +460,7 @@ namespace Esyur.Net.IIP
|
|||||||
|
|
||||||
// unsubscribe
|
// unsubscribe
|
||||||
r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
||||||
|
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;
|
||||||
// r.Instance.Children.OnAdd -= Children_OnAdd;
|
// r.Instance.Children.OnAdd -= Children_OnAdd;
|
||||||
@ -501,6 +502,7 @@ namespace Esyur.Net.IIP
|
|||||||
|
|
||||||
// subscribe
|
// subscribe
|
||||||
r.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
r.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
||||||
|
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;
|
||||||
//r.Instance.Children.OnAdd += Children_OnAdd;
|
//r.Instance.Children.OnAdd += Children_OnAdd;
|
||||||
@ -581,6 +583,7 @@ namespace Esyur.Net.IIP
|
|||||||
var r = res as IResource;
|
var r = res as IResource;
|
||||||
// unsubscribe
|
// unsubscribe
|
||||||
r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
||||||
|
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;
|
||||||
//r.Instance.Children.OnAdd -= Children_OnAdd;
|
//r.Instance.Children.OnAdd -= Children_OnAdd;
|
||||||
@ -590,6 +593,7 @@ namespace Esyur.Net.IIP
|
|||||||
|
|
||||||
// subscribe
|
// subscribe
|
||||||
r.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
r.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
||||||
|
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;
|
||||||
//r.Instance.Children.OnAdd += Children_OnAdd;
|
//r.Instance.Children.OnAdd += Children_OnAdd;
|
||||||
@ -619,6 +623,7 @@ namespace Esyur.Net.IIP
|
|||||||
{
|
{
|
||||||
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.ResourceModified -= Instance_PropertyModified;
|
r.Instance.ResourceModified -= Instance_PropertyModified;
|
||||||
r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
||||||
|
|
||||||
@ -2210,25 +2215,14 @@ namespace Esyur.Net.IIP
|
|||||||
|
|
||||||
// private void Instance_EventOccurred(IResource resource, string name, string[] users, DistributedConnection[] connections, object[] args)
|
// private void Instance_EventOccurred(IResource resource, string name, string[] users, DistributedConnection[] connections, object[] args)
|
||||||
|
|
||||||
private void Instance_EventOccurred(IResource resource, object issuer, Session[] receivers, string name, object[] args)
|
private void Instance_CustomEventOccurred(IResource resource, object issuer, Func<Session, bool> receivers, string name, object[] args)
|
||||||
{
|
{
|
||||||
var et = resource.Instance.Template.GetEventTemplateByName(name);
|
var et = resource.Instance.Template.GetEventTemplateByName(name);
|
||||||
|
|
||||||
if (et == null)
|
if (et == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
if (!receivers(this.session))
|
||||||
if (users != null)
|
|
||||||
if (!users.Contains(RemoteUsername))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (connections != null)
|
|
||||||
if (!connections.Contains(this))
|
|
||||||
return;
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (receivers != null)
|
|
||||||
if (!receivers.Contains(this.session))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (resource.Instance.Applicable(this.session, ActionType.ReceiveEvent, et, issuer) == Ruling.Denied)
|
if (resource.Instance.Applicable(this.session, ActionType.ReceiveEvent, et, issuer) == Ruling.Denied)
|
||||||
@ -2241,5 +2235,24 @@ namespace Esyur.Net.IIP
|
|||||||
.AddUInt8Array(Codec.ComposeVarArray(args, this, true))
|
.AddUInt8Array(Codec.ComposeVarArray(args, this, true))
|
||||||
.Done();
|
.Done();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Instance_EventOccurred(IResource resource, string name, object[] args)
|
||||||
|
{
|
||||||
|
var et = resource.Instance.Template.GetEventTemplateByName(name);
|
||||||
|
|
||||||
|
if (et == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
if (resource.Instance.Applicable(this.session, ActionType.ReceiveEvent, et, null) == Ruling.Denied)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// compose the packet
|
||||||
|
SendEvent(IIPPacket.IIPPacketEvent.EventOccurred)
|
||||||
|
.AddUInt32(resource.Instance.Id)
|
||||||
|
.AddUInt8((byte)et.Index)
|
||||||
|
.AddUInt8Array(Codec.ComposeVarArray(args, this, true))
|
||||||
|
.Done();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,5 +20,8 @@ namespace Esyur.Net.IIP
|
|||||||
{
|
{
|
||||||
this.Method = method;
|
this.Method = method;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static implicit operator DistributedPropertyContext(Func<DistributedConnection, object> method)
|
||||||
|
=> new DistributedPropertyContext(method);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ namespace Esyur.Net.IIP
|
|||||||
{
|
{
|
||||||
var et = Instance.Template.GetEventTemplateByIndex(index);
|
var et = Instance.Template.GetEventTemplateByIndex(index);
|
||||||
events[index]?.Invoke(this, args);
|
events[index]?.Invoke(this, args);
|
||||||
Instance.EmitResourceEvent(null, null, et.Name, args);
|
Instance.EmitResourceEvent(et.Name, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AsyncReply<object> _InvokeByNamedArguments(byte index, Structure namedArgs)
|
public AsyncReply<object> _InvokeByNamedArguments(byte index, Structure namedArgs)
|
||||||
|
@ -140,11 +140,7 @@ namespace Esyur.Net.IIP
|
|||||||
|
|
||||||
protected override void ClientDisconnected(DistributedConnection sender)
|
protected override void ClientDisconnected(DistributedConnection sender)
|
||||||
{
|
{
|
||||||
sender.Destroy();
|
|
||||||
|
|
||||||
Warehouse.Remove(sender);
|
Warehouse.Remove(sender);
|
||||||
|
|
||||||
//Console.WriteLine("DistributedConnection Client Disconnected");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,11 @@ namespace Esyur.Proxy
|
|||||||
|
|
||||||
public static Type GetBaseType(Type type)
|
public static Type GetBaseType(Type type)
|
||||||
{
|
{
|
||||||
|
if (type.Assembly.IsDynamic)
|
||||||
|
return type.GetTypeInfo().BaseType;
|
||||||
|
else
|
||||||
|
return type;
|
||||||
|
|
||||||
if (type.FullName.Contains("Esyur.Proxy.T"))
|
if (type.FullName.Contains("Esyur.Proxy.T"))
|
||||||
#if NETSTANDARD
|
#if NETSTANDARD
|
||||||
return type.GetTypeInfo().BaseType;
|
return type.GetTypeInfo().BaseType;
|
||||||
|
@ -44,5 +44,7 @@ namespace Esyur.Resource
|
|||||||
get;
|
get;
|
||||||
set;
|
set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,8 @@ namespace Esyur.Resource
|
|||||||
{
|
{
|
||||||
string name;
|
string name;
|
||||||
|
|
||||||
|
// public int IntVal { get; set; }
|
||||||
|
|
||||||
WeakReference<IResource> resource;
|
WeakReference<IResource> resource;
|
||||||
IStore store;
|
IStore store;
|
||||||
ResourceTemplate template;
|
ResourceTemplate template;
|
||||||
@ -27,11 +29,15 @@ namespace Esyur.Resource
|
|||||||
|
|
||||||
|
|
||||||
public delegate void ResourceModifiedEvent(IResource resource, string propertyName, object newValue);
|
public delegate void ResourceModifiedEvent(IResource resource, string propertyName, object newValue);
|
||||||
public delegate void ResourceEventOccurredEvent(IResource resource, object issuer, Session[] receivers, string eventName, object[] args);
|
public delegate void ResourceEventOccurredEvent(IResource resource, string eventName, object[] args);
|
||||||
|
|
||||||
|
public delegate void CustomResourceEventOccurredEvent(IResource resource, object issuer, Func<Session, bool> receivers, string eventName, object[] args);
|
||||||
|
|
||||||
public delegate void ResourceDestroyedEvent(IResource resource);
|
public delegate void ResourceDestroyedEvent(IResource resource);
|
||||||
|
|
||||||
public event ResourceModifiedEvent ResourceModified;
|
public event ResourceModifiedEvent ResourceModified;
|
||||||
public event ResourceEventOccurredEvent ResourceEventOccurred;
|
public event ResourceEventOccurredEvent ResourceEventOccurred;
|
||||||
|
public event CustomResourceEventOccurredEvent CustomResourceEventOccurred;
|
||||||
public event ResourceDestroyedEvent ResourceDestroyed;
|
public event ResourceDestroyedEvent ResourceDestroyed;
|
||||||
|
|
||||||
bool loading = false;
|
bool loading = false;
|
||||||
@ -582,13 +588,21 @@ namespace Esyur.Resource
|
|||||||
|
|
||||||
// internal void EmitResourceEvent(string name, string[] users, DistributedConnection[] connections, object[] args)
|
// internal void EmitResourceEvent(string name, string[] users, DistributedConnection[] connections, object[] args)
|
||||||
|
|
||||||
internal void EmitResourceEvent(object issuer, Session[] receivers, string name, object[] args)
|
internal void EmitCustomResourceEvent(object issuer, Func<Session, bool> receivers, string name, object[] args)
|
||||||
{
|
{
|
||||||
IResource res;
|
IResource res;
|
||||||
if (this.resource.TryGetTarget(out res))
|
if (this.resource.TryGetTarget(out res))
|
||||||
{
|
{
|
||||||
|
CustomResourceEventOccurred?.Invoke(res, issuer, receivers, name, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ResourceEventOccurred?.Invoke(res, issuer, receivers, name, args);
|
internal void EmitResourceEvent(string name, object[] args)
|
||||||
|
{
|
||||||
|
IResource res;
|
||||||
|
if (this.resource.TryGetTarget(out res))
|
||||||
|
{
|
||||||
|
ResourceEventOccurred?.Invoke(res, name, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -891,7 +905,7 @@ namespace Esyur.Resource
|
|||||||
// if (ca.Length == 0)
|
// if (ca.Length == 0)
|
||||||
// continue;
|
// continue;
|
||||||
|
|
||||||
ResourceEventHanlder proxyDelegate = (args) => EmitResourceEvent(null, null, evt.Name, args);
|
ResourceEventHanlder proxyDelegate = (args) => EmitResourceEvent(evt.Name, args);
|
||||||
evt.Info.AddEventHandler(resource, proxyDelegate);
|
evt.Info.AddEventHandler(resource, proxyDelegate);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -901,7 +915,7 @@ namespace Esyur.Resource
|
|||||||
//if (ca.Length == 0)
|
//if (ca.Length == 0)
|
||||||
// continue;
|
// continue;
|
||||||
|
|
||||||
CustomResourceEventHanlder proxyDelegate = (issuer, receivers, args) => EmitResourceEvent(issuer, receivers, evt.Name, args);
|
CustomResourceEventHanlder proxyDelegate = (issuer, receivers, args) => EmitCustomResourceEvent(issuer, receivers, evt.Name, args);
|
||||||
evt.Info.AddEventHandler(resource, proxyDelegate);
|
evt.Info.AddEventHandler(resource, proxyDelegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ namespace Esyur.Resource
|
|||||||
//public delegate void CustomReceiversEventHanlder(DistributedConnection[] connections, params object[] args);
|
//public delegate void CustomReceiversEventHanlder(DistributedConnection[] connections, params object[] args);
|
||||||
//public delegate void CustomInquirerEventHanlder(object inquirer, params object[] args);
|
//public delegate void CustomInquirerEventHanlder(object inquirer, params object[] args);
|
||||||
|
|
||||||
public delegate void CustomResourceEventHanlder(object issuer, Session[] receivers, params object[] args);
|
public delegate void CustomResourceEventHanlder(object issuer, Func<Session, bool> receivers, params object[] args);// object issuer, Session[] receivers, params object[] args);
|
||||||
|
|
||||||
// public delegate void CustomReceiversEventHanlder(string[] usernames, DistributedConnection[] connections, params object[] args);
|
// public delegate void CustomReceiversEventHanlder(string[] usernames, DistributedConnection[] connections, params object[] args);
|
||||||
|
|
||||||
|
@ -115,6 +115,9 @@ namespace Esyur.Resource
|
|||||||
/// <returns>True, if no problem occurred.</returns>
|
/// <returns>True, if no problem occurred.</returns>
|
||||||
public static async AsyncReply<bool> Open()
|
public static async AsyncReply<bool> Open()
|
||||||
{
|
{
|
||||||
|
if (warehouseIsOpen)
|
||||||
|
return false;
|
||||||
|
|
||||||
warehouseIsOpen = true;
|
warehouseIsOpen = true;
|
||||||
|
|
||||||
var resSnap = resources.Select(x =>
|
var resSnap = resources.Select(x =>
|
||||||
@ -526,7 +529,7 @@ namespace Esyur.Resource
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IResource New(Type type, string name, IStore store = null, IResource parent = null, IPermissionsManager manager = null, object attributes = null, object properties = null)
|
public static IResource New(Type type, string name = null, IStore store = null, IResource parent = null, IPermissionsManager manager = null, object attributes = null, object properties = null)
|
||||||
{
|
{
|
||||||
type = ResourceProxy.GetProxy(type);
|
type = ResourceProxy.GetProxy(type);
|
||||||
|
|
||||||
@ -618,12 +621,15 @@ namespace Esyur.Resource
|
|||||||
/// <returns>Resource template.</returns>
|
/// <returns>Resource template.</returns>
|
||||||
public static ResourceTemplate GetTemplate(Type type)
|
public static ResourceTemplate GetTemplate(Type type)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
var baseType = ResourceProxy.GetBaseType(type);
|
||||||
|
|
||||||
// loaded ?
|
// loaded ?
|
||||||
foreach (var t in templates.Values)
|
foreach (var t in templates.Values)
|
||||||
if (t.ClassName == type.FullName)
|
if (t.ClassName == baseType.FullName)
|
||||||
return t;
|
return t;
|
||||||
|
|
||||||
var template = new ResourceTemplate(type);
|
var template = new ResourceTemplate(baseType);
|
||||||
templates.Add(template.ClassId, template);
|
templates.Add(template.ClassId, template);
|
||||||
|
|
||||||
return template;
|
return template;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user