Skip to content

Commit

Permalink
0.0.1-preview.315 fix dynamic proxy bug
Browse files Browse the repository at this point in the history
  • Loading branch information
ZeeLyn committed Mar 26, 2019
1 parent 92847a2 commit 7b80211
Show file tree
Hide file tree
Showing 21 changed files with 92 additions and 71 deletions.
9 changes: 9 additions & 0 deletions samples/Sample.Common/ResponseResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Sample.Common
{
public class ResponseResult<T>
{
public bool Success;
public T Result;
public string Error;
}
}
6 changes: 4 additions & 2 deletions samples/Sample.Server/Controllers/ValuesController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,11 @@ public async Task<IActionResult> Get()
//await HelloService.SayHello();
return Ok(new
{
//name = await HelloService.SetMeta(("token", "bearer .....")).SayHello(Guid.NewGuid().ToString()),
name = await HelloService.SetMeta(("token", "bearer .....")).SayHello(Guid.NewGuid().ToString()),
Reply = await HelloService.SayHello("Owen"),
//entity = await HelloService.SayHello(new TestModel { Id = 1, Name = "owen" })
entity = await HelloService.SayHello(new TestModel { Id = 1, Name = "owen" }),
gen = await HelloService.Test()

});
}

Expand Down
14 changes: 14 additions & 0 deletions samples/Sample.Server/HelloService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,19 @@ public async Task<int> Age()
//await Task.Delay(2000);
return await Task.FromResult(18);
}

public async Task<ResponseResult<string>> Test()
{
return await Task.FromResult(new ResponseResult<string>
{
Success = true,
Result = "OK"
});
}

public Task Test(ResponseResult<string> r)
{
throw new NotImplementedException();
}
}
}
4 changes: 4 additions & 0 deletions samples/Sample.Service.Interfaces/IHelloService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,9 @@ public interface IHelloService : IService

[ServiceRoute("say/int")]
Task<int> Age();

Task<ResponseResult<string>> Test();

Task Test(ResponseResult<string> r);
}
}
2 changes: 1 addition & 1 deletion src/Uragano.Abstract/Uragano.Abstractions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>7.1</LangVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<Description>A simple, high performance RPC library.</Description>
<PackageProjectUrl>https://github.com/ww198643/Uragano</PackageProjectUrl>
<PackageTags>Uragano,RPC,DotNetty,Microservice,MessagePack,DynamicProxy</PackageTags>
Expand Down
2 changes: 1 addition & 1 deletion src/Uragano.Caching.Memory/Uragano.Caching.Memory.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<Authors>Owen</Authors>
<Company>Owen</Company>
<Description>A simple, high performance RPC library.</Description>
Expand Down
30 changes: 0 additions & 30 deletions src/Uragano.Caching.Redis/InitializationRedis.cs

This file was deleted.

4 changes: 3 additions & 1 deletion src/Uragano.Caching.Redis/RedisCaching.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Uragano.Abstractions;

Expand All @@ -8,9 +9,10 @@ public class RedisCaching : ICaching
{
private ICodec Codec { get; }

public RedisCaching(ICodec codec)
public RedisCaching(ICodec codec, UraganoSettings uraganoSettings)
{
Codec = codec;
RedisHelper.Initialization(new CSRedis.CSRedisClient(((RedisOptions)uraganoSettings.CachingOptions).ConnectionStrings.First().ToString()));
}

public async Task Set<TValue>(string key, TValue value, int expireSeconds = -1)
Expand Down
2 changes: 1 addition & 1 deletion src/Uragano.Caching.Redis/Uragano.Caching.Redis.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<Authors>Owen</Authors>
<Company>Owen</Company>
<Description>A simple, high performance RPC library.</Description>
Expand Down
2 changes: 0 additions & 2 deletions src/Uragano.Caching.Redis/UraganoBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ public static class UraganoBuilderExtensions
public static void AddRedisCaching(this IUraganoBuilder builder, RedisOptions redisOptions)
{
builder.AddCaching<RedisCaching>(redisOptions);
builder.AddHostedService<InitializationRedis>();
}

public static void AddRedisCaching(this IUraganoBuilder builder, IConfigurationSection configurationSection)
Expand All @@ -30,7 +29,6 @@ public static void AddRedisCaching(this IUraganoSampleBuilder builder)
public static void AddRedisCaching<TKeyGenerator>(this IUraganoBuilder builder, RedisOptions redisOptions) where TKeyGenerator : class, ICachingKeyGenerator
{
builder.AddCaching<RedisCaching, TKeyGenerator>(redisOptions);
builder.AddHostedService<InitializationRedis>();
}

public static void AddRedisCaching<TKeyGenerator>(this IUraganoBuilder builder, IConfigurationSection configurationSection) where TKeyGenerator : class, ICachingKeyGenerator
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<Description>A simple, high performance RPC library.</Description>
<PackageProjectUrl>https://github.com/ww198643/Uragano</PackageProjectUrl>
<PackageIconUrl>https://github.com/ww198643/Uragano/blob/master/icon.png?raw=true</PackageIconUrl>
Expand Down
2 changes: 1 addition & 1 deletion src/Uragano.Consul/Uragano.Consul.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<PackageTags>Uragano,RPC,DotNetty,Microservice,MessagePack,DynamicProxy</PackageTags>
<PackageProjectUrl>https://github.com/ww198643/Uragano</PackageProjectUrl>
<Description>A simple, high performance RPC library.</Description>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<PackageLicenseUrl>https://github.com/ww198643/Uragano/blob/master/LICENSE</PackageLicenseUrl>
<Authors>Owen</Authors>
<Company>Owen</Company>
Expand Down
2 changes: 1 addition & 1 deletion src/Uragano.Core/Uragano.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<PackageIconUrl>https://github.com/ww198643/Uragano/blob/master/icon.png?raw=true</PackageIconUrl>
<PackageProjectUrl>https://github.com/ww198643/Uragano</PackageProjectUrl>
<Description>A simple, high performance RPC library.</Description>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<PackageLicenseUrl>https://github.com/ww198643/Uragano/blob/master/LICENSE</PackageLicenseUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>Owen</Authors>
Expand Down
63 changes: 47 additions & 16 deletions src/Uragano.DynamicProxy/ProxyGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,16 @@ public static List<Type> GenerateProxy(List<Type> interfaces)

var assemblies = DependencyContext.Default.RuntimeLibraries.SelectMany(i => i.GetDefaultAssemblyNames(DependencyContext.Default).Select(z => Assembly.Load(new AssemblyName(z.Name)))).Where(i => !i.IsDynamic);

var types = assemblies.Select(p => p.GetType());
types = types.Except(interfaces);
foreach (var type in types)
{
assemblies = assemblies.Append(type.Assembly);
}
var types = assemblies.Select(p => p.GetType()).Except(interfaces);
assemblies = types.Aggregate(assemblies, (current, type) => current.Append(type.Assembly));

var trees = interfaces.Select(GenerateProxyTree).ToList();
//for (var i = 0; i < trees.Count; i++)
//{
// File.WriteAllText(Path.Combine(Directory.GetCurrentDirectory(), $"{interfaces[i].Name}.Imp.cs"),
// trees[i].ToString());
//}

using (var stream = CompileClientProxy(trees,
assemblies.Select(x => MetadataReference.CreateFromFile(x.Location))
.Concat(new[]
Expand All @@ -45,21 +47,47 @@ public static List<Type> GenerateProxy(List<Type> interfaces)

private static SyntaxTree GenerateProxyTree(Type @interface)
{
var namespaces = FindAllNamespace(@interface).Distinct().Select(p => SyntaxFactory.UsingDirective(GenerateQualifiedNameSyntax(p))).ToList();
namespaces.Add(SyntaxFactory.UsingDirective(SyntaxFactory.IdentifierName("System")));

var syntax = SyntaxFactory.CompilationUnit()
.WithUsings(SyntaxFactory.List(new[]
{
SyntaxFactory.UsingDirective(SyntaxFactory.IdentifierName("System")),
SyntaxFactory.UsingDirective(GenerateQualifiedNameSyntax("System.Threading.Tasks")),
SyntaxFactory.UsingDirective(GenerateQualifiedNameSyntax("System.Collections.Generic")),
SyntaxFactory.UsingDirective(GenerateQualifiedNameSyntax(typeof(DynamicProxyAbstract).Namespace)),
SyntaxFactory.UsingDirective(GenerateQualifiedNameSyntax(typeof(IRemotingInvoke).Namespace)),
SyntaxFactory.UsingDirective(GenerateQualifiedNameSyntax(@interface.Namespace))
}))
.WithUsings(SyntaxFactory.List(namespaces))
.WithMembers(GenerateNamespace(@interface));

return syntax.NormalizeWhitespace().SyntaxTree;
}

private static List<string> FindAllNamespace(Type @interface)
{
var namespaces = new List<string>{
"System.Threading.Tasks","System.Collections.Generic",typeof(DynamicProxyAbstract).Namespace,typeof(IRemotingInvoke).Namespace,@interface.Namespace
};
foreach (var method in @interface.GetMethods())
{
var returnType = method.ReturnType;
FindNamespace(returnType, namespaces);
foreach (var arg in method.GetParameters())
{
FindNamespace(arg.ParameterType, namespaces);
}
}

return namespaces;
}

private static void FindNamespace(Type type, List<string> namespaces)
{
if (type.Namespace == "System.Threading.Tasks" && !type.IsGenericType || type.Namespace == "System" || type.Namespace == "System.Collections.Generic")
return;

namespaces.Add(type.Namespace);
if (!type.IsGenericType) return;
foreach (var item in type.GetGenericArguments())
{
FindNamespace(item, namespaces);
}
}

/// <summary>
/// Generate namespace
/// </summary>
Expand Down Expand Up @@ -217,15 +245,18 @@ private static TypeSyntax GenerateType(Type type)
{
if (!type.IsGenericType)
return GenerateQualifiedNameSyntax(type);


var list = new List<SyntaxNodeOrToken>();
foreach (var genericType in type.GetGenericArguments())
{
list.Add(genericType.IsGenericType ? GenerateType(genericType) : GenerateQualifiedNameSyntax(genericType.FullName));
list.Add(SyntaxFactory.Token(SyntaxKind.CommaToken));
}

var typeArgumentList = SyntaxFactory.TypeArgumentList(SyntaxFactory.SeparatedList<TypeSyntax>(list.Take(list.Count - 1)));
//if (type.Namespace == typeof(Task).Namespace)
return SyntaxFactory.GenericName(type.Name.Substring(0, type.Name.IndexOf('`'))).WithTypeArgumentList(typeArgumentList);
//return SyntaxFactory.GenericName(type.FullName?.Substring(0, type.FullName.IndexOf('`'))).WithTypeArgumentList(typeArgumentList);
}


Expand Down
8 changes: 0 additions & 8 deletions src/Uragano.DynamicProxy/RemotingInvoke.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,6 @@ public async Task<T> InvokeAsync<T>(object[] args, string route, string serviceN
context.Interceptors.Push(interceptor);
}

//if (UraganoSettings.ClientGlobalInterceptors.Any())
//{
// foreach (var interceptor in UraganoSettings.ClientGlobalInterceptors)
// {
// context.Interceptors.Push(interceptor);
// }
//}

var result = await ((IInterceptor)scope.ServiceProvider.GetRequiredService(context.Interceptors.Pop())).Intercept(context);
if (result.Status != RemotingStatus.Ok)
throw new RemoteInvokeException(route, result.Result?.ToString(), result.Status);
Expand Down
2 changes: 1 addition & 1 deletion src/Uragano.DynamicProxy/Uragano.DynamicProxy.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<PackageIconUrl>https://github.com/ww198643/Uragano/blob/master/icon.png?raw=true</PackageIconUrl>
<PackageProjectUrl>https://github.com/ww198643/Uragano</PackageProjectUrl>
<Description>A simple, high performance RPC library.</Description>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<PackageLicenseUrl>https://github.com/ww198643/Uragano/blob/master/LICENSE</PackageLicenseUrl>
<Authors>Owen</Authors>
<Company>Owen</Company>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<Authors>Owen</Authors>
<Company>Owen</Company>
<Description>A simple, high performance RPC library.</Description>
Expand Down
2 changes: 1 addition & 1 deletion src/Uragano.Logging.Log4net/Uragano.Logging.Log4Net.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<Authors>Owen</Authors>
<Company>Owen</Company>
<Description>A simple, high performance RPC library.</Description>
Expand Down
2 changes: 1 addition & 1 deletion src/Uragano.Logging.NLog/Uragano.Logging.NLog.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<Authors>Owen</Authors>
<Company>Owen</Company>
<Description>A simple, high performance RPC library.</Description>
Expand Down
1 change: 0 additions & 1 deletion src/Uragano.Remoting/ServerMessageHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ await context.WriteAndFlushAsync(new TransportMessage<IServiceResult>
Body = new ServiceResult(e.Message, RemotingStatus.Error)
});
}

});
}

Expand Down
2 changes: 1 addition & 1 deletion src/Uragano.Remoting/Uragano.Remoting.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<PackageIconUrl>https://github.com/ww198643/Uragano/blob/master/icon.png?raw=true</PackageIconUrl>
<PackageProjectUrl>https://github.com/ww198643/Uragano</PackageProjectUrl>
<Description>A simple, high performance RPC library.</Description>
<Version>0.0.1-preview.313</Version>
<Version>0.0.1-preview.315</Version>
<PackageLicenseUrl>https://github.com/ww198643/Uragano/blob/master/LICENSE</PackageLicenseUrl>
<Authors>Owen</Authors>
<Company>Owen</Company>
Expand Down

0 comments on commit 7b80211

Please sign in to comment.