You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by "Nikolay Izhikov (Jira)" <ji...@apache.org> on 2021/03/10 16:23:00 UTC
[jira] [Created] (IGNITE-14299) .Net Service loses array type
information in case .Net <-> .Net call
Nikolay Izhikov created IGNITE-14299:
----------------------------------------
Summary: .Net Service loses array type information in case .Net <-> .Net call
Key: IGNITE-14299
URL: https://issues.apache.org/jira/browse/IGNITE-14299
Project: Ignite
Issue Type: Improvement
Reporter: Nikolay Izhikov
Assignee: Nikolay Izhikov
In case .Net -> .Net service call Ignite loses arra type information.
{code:java}
using Apache.Ignite.Core;
using Apache.Ignite.Core.Discovery.Tcp;
using Apache.Ignite.Core.Discovery.Tcp.Static;
using Apache.Ignite.Core.Services;
using Castle.DynamicProxy;
using System;
using System.Linq;
using Xunit;
namespace Ignite.ServiceReturnsArray
{
public class Test : IDisposable
{
private readonly IIgnite igniteSrv;
private readonly IIgnite ignite;
public Test()
{
IgniteConfiguration IgniteConfig(bool clientMode) => new IgniteConfiguration()
{
ClientMode = clientMode,
IgniteInstanceName = Guid.NewGuid().ToString(),
DiscoverySpi = new TcpDiscoverySpi
{
IpFinder = new TcpDiscoveryStaticIpFinder { Endpoints = new[] { "127.0.0.1:47500" } }
}
};
igniteSrv = Ignition.Start(IgniteConfig(false));
ignite = Ignition.Start(IgniteConfig(true));
ignite.GetServices().DeployClusterSingleton(nameof(ArrayFactoryService), new ArrayFactoryService());
}
public void Dispose()
{
ignite.Dispose();
igniteSrv.Dispose();
}
[Fact]
public void ServiceReturnsArray()
{
var arr = ignite.GetServices().GetServiceProxy<IArrayFactory>(nameof(ArrayFactoryService), false)
.CreateArray(2, 1);
Assert.IsType<Result[]>(arr);
Assert.Equal(1, arr?[1]?.Value);
}
[Fact]
public void ServiceReturnsArrayWithReflection()
{
var arr = typeof(IArrayFactory).GetMethod(nameof(IArrayFactory.CreateArray)).Invoke(
ignite.GetServices().GetServiceProxy<IArrayFactory>(nameof(ArrayFactoryService)),
new object[] { 2, 1 });
Assert.IsType<Result[]>(arr);
Assert.Equal(1, ((Result[])arr)?[1]?.Value);
}
[Fact]
public void ServiceReturnsArrayWithCastleProxy()
{
var interceptor = new ServiceInterceptor<IArrayFactory>(ignite, nameof(ArrayFactoryService));
var arr = new ProxyGenerator().CreateInterfaceProxyWithoutTarget<IArrayFactory>(interceptor)
.CreateArray(2, 1);
Assert.IsType<Result[]>(arr);
Assert.Equal(1, arr?[1]?.Value);
}
public sealed class Result
{
public int Value { get; set; }
}
public interface IArrayFactory
{
Result[] CreateArray(int size, int dlftVal);
}
public sealed class ArrayFactoryService : IArrayFactory, IService
{
public Result[] CreateArray(int size, int dfltVal)
{
return Enumerable.Repeat(new Result { Value = dfltVal }, size).ToArray();
}
public void Cancel(IServiceContext context)
{
}
public void Execute(IServiceContext context)
{
}
public void Init(IServiceContext context)
{
}
}
private sealed class ServiceInterceptor<T> : IInterceptor where T: class
{
private readonly IIgnite ignite;
private readonly string name;
public ServiceInterceptor(IIgnite ignite, string name)
{
this.ignite = ignite;
this.name = name;
}
public void Intercept(IInvocation invocation)
{
var svc = ignite.GetServices().GetServiceProxy<T>(name, false);
invocation.ReturnValue = invocation.Method.Invoke(svc, invocation.Arguments);
}
}
}
}
{code}
Above test fail on type check.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)