public ThriftMethodHandler(ThriftMethodMetadata methodMetadata, ThriftCodecManager codecManager) { this.QualifiedName = methodMetadata.QualifiedName; this.Name = methodMetadata.Name; this._invokeAsynchronously = methodMetadata.IsAsync; this._oneway = !_invokeAsynchronously && methodMetadata.IsOneWay; ParameterHandler[] parameters = new ParameterHandler[methodMetadata.Parameters.Count()]; foreach (var fieldMetadata in methodMetadata.Parameters) { ThriftParameterInjection parameter = (ThriftParameterInjection)fieldMetadata.Injections.First(); ParameterHandler handler = new ParameterHandler( fieldMetadata.Id, fieldMetadata.Name, codecManager.GetCodec(fieldMetadata.ThriftType)); parameters[parameter.ParameterIndex] = handler; } this._parameterCodecs = parameters; var builder = ImmutableDictionary.CreateBuilder <short, IThriftCodec>(); foreach (var entry in methodMetadata.Exceptions) { builder.Add(entry.Key, codecManager.GetCodec(entry.Value)); } _exceptionCodecs = builder.ToImmutableDictionary(); // get the thrift codec for the return value _successCodec = codecManager.GetCodec(methodMetadata.ReturnType); }
public ThriftClientManager(ThriftCodecManager codecManager, NiftyClient niftyClient, IEnumerable <ThriftClientEventHandler> globalEventHandlers, IThriftClientFactory clientFactory = null, ILoggerFactory loggerFactory = null) { Guard.ArgumentNotNull(codecManager, nameof(codecManager)); Guard.ArgumentNotNull(niftyClient, nameof(niftyClient)); this.niftyClient = niftyClient; this.codecManager = codecManager; this.globalEventHandlers = globalEventHandlers ?? Enumerable.Empty <ThriftClientEventHandler>(); _loggerFactory = loggerFactory; _logger = loggerFactory?.CreateLogger <ThriftClientManager>() ?? (ILogger)NullLogger.Instance; _thriftClientFactory = clientFactory ?? new DynamicProxyClientFactory(); }
protected AbstractReflectionThriftCodec(ThriftCodecManager manager, ThriftStructMetadata metadata) { Guard.ArgumentNotNull(manager, nameof(manager)); Guard.ArgumentNotNull(metadata, nameof(metadata)); this._metadata = metadata; _fields = new SortedDictionary <short, IThriftCodec>(); foreach (ThriftFieldMetadata fieldMetadata in metadata.GetFields(FieldKind.ThriftField)) { _fields.Add(fieldMetadata.Id, manager.GetCodec(fieldMetadata.ThriftType)); } }
public IThriftCodec GenerateThriftTypeCodec(ThriftCodecManager codecManager, ThriftStructMetadata metadata) { switch (metadata.MetadataType) { case MetadataType.Struct: var type = metadata.StructType; var codecType = typeof(ReflectionThriftStructCodec <>).MakeGenericType(type); return((IThriftCodec)Activator.CreateInstance(codecType, codecManager, metadata)); case MetadataType.Union: default: throw new ThriftyException($"encountered type {metadata.MetadataType}"); } }
public ThriftMethodProcessor( Func <IRequestContext, Object> service, String serviceName, ThriftMethodMetadata methodMetadata, ThriftCodecManager codecManager, ILoggerFactory loggerFactory = null) { Guard.ArgumentNotNull(service, nameof(service)); _logger = loggerFactory?.CreateLogger <ThriftMethodProcessor>() ?? (ILogger)NullLogger.Instance; this._serviceFactory = service; this.ServiceName = serviceName; this.Name = methodMetadata.Name; this.QualifiedName = methodMetadata.QualifiedName; this._resultStructName = $"{this.Name}_result"; this._method = methodMetadata.Method; this._oneway = methodMetadata.IsOneWay && !methodMetadata.IsAsync; this._parameters = methodMetadata.Parameters; var builder = ImmutableDictionary.CreateBuilder <short, IThriftCodec>(); foreach (ThriftFieldMetadata fieldMetadata in methodMetadata.Parameters) { builder.Add(fieldMetadata.Id, codecManager.GetCodec(fieldMetadata.ThriftType)); } this._parameterCodecs = builder.ToImmutableDictionary(); // Build a mapping from thrift parameter ID to a position in the formal argument list var parameterOrderingBuilder = ImmutableDictionary.CreateBuilder <short, short>(); short argumentPosition = 0; foreach (ThriftFieldMetadata fieldMetadata in methodMetadata.Parameters) { parameterOrderingBuilder.Add(fieldMetadata.Id, argumentPosition++); } _thriftParameterIdToCSharpArgument = parameterOrderingBuilder.ToImmutableDictionary(); var exceptions = ImmutableDictionary.CreateBuilder <Type, ExceptionProcessor>(); foreach (var entry in methodMetadata.Exceptions) { ExceptionProcessor processor = new ExceptionProcessor(entry.Key, codecManager.GetCodec(entry.Value)); exceptions.Add(entry.Value.CSharpType, processor); } this._exceptionCodecs = exceptions.ToImmutableDictionary(); this._successCodec = codecManager.GetCodec(methodMetadata.ReturnType); }
public ThriftServiceProcessor( IEnumerable <Object> services, ThriftCodecManager codecManager = null, IEnumerable <ThriftEventHandler> eventHandlers = null, ILoggerFactory loggerFactory = null) { if (services == null || !services.Any()) { throw new ArgumentException($"{nameof(ThriftServiceProcessor)} 构造函数参数 {nameof(services)} 不能为空或空集合。"); } codecManager = codecManager ?? new ThriftCodecManager(); this.BuildMethods(services.ToDictionary(o => o.GetType(), o => new Func <IRequestContext, object>(ctx => o)), codecManager, loggerFactory); _logger = loggerFactory?.CreateLogger <ThriftServiceProcessor>() ?? (ILogger)NullLogger.Instance; _eventHandlers = eventHandlers ?? Enumerable.Empty <ThriftEventHandler>(); }
internal ThriftClientMetadata( Type clientType, String clientName, ThriftCodecManager codecManager) { Guard.ArgumentNotNull(clientType, nameof(clientType)); Guard.ArgumentNotNull(codecManager, nameof(codecManager)); Guard.ArgumentNullOrWhiteSpaceString(clientName, nameof(clientName)); this.ClientName = clientName; thriftServiceMetadata = new ThriftServiceMetadata(clientType, codecManager.Catalog); this.ClientType = thriftServiceMetadata.Name; this.MethodHandlers = new Dictionary <MethodInfo, ThriftMethodHandler>(); foreach (ThriftMethodMetadata methodMetadata in thriftServiceMetadata.Methods.Values) { ThriftMethodHandler methodHandler = new ThriftMethodHandler(methodMetadata, codecManager); MethodHandlers.Add(methodMetadata.Method, methodHandler); } }
public ThriftServiceProcessor( IServiceLocator serviceLocator, IEnumerable <Type> serviceTypes, ThriftCodecManager codecManager = null, IEnumerable <ThriftEventHandler> eventHandlers = null, ILoggerFactory loggerFactory = null) { Guard.ArgumentNotNull(serviceLocator, nameof(serviceLocator)); if (serviceTypes == null || !serviceTypes.Any()) { throw new ArgumentException($"{nameof(ThriftServiceProcessor)} 构造函数参数 {nameof(serviceTypes)} 不能为空或空集合。"); } codecManager = codecManager ?? new ThriftCodecManager(); var processorMap = ImmutableDictionary.CreateBuilder <String, ThriftMethodProcessor>(); this.BuildMethods( serviceTypes.ToDictionary(t => t, t => new Func <IRequestContext, object>(ctx => serviceLocator.GetService(ctx, t))), codecManager, loggerFactory); _logger = loggerFactory?.CreateLogger <ThriftServiceProcessor>() ?? (ILogger)NullLogger.Instance; _eventHandlers = eventHandlers ?? Enumerable.Empty <ThriftEventHandler>(); }
public ReflectionThriftStructCodec(ThriftCodecManager manager, ThriftStructMetadata metadata) : base(manager, metadata) { }
public ThriftClientManager(ThriftCodecManager codecManager, IThriftClientFactory clientFactory = null, ILoggerFactory loggerFactory = null) : this(codecManager, new NiftyClient(), Enumerable.Empty <ThriftClientEventHandler>(), clientFactory, loggerFactory) { }
public ThriftSerializer(SerializeProtocol protocol = SerializeProtocol.Binary) { _thriftCodecManager = new ThriftCodecManager(); this.Protocol = protocol; }
private void BuildMethods(IDictionary <Type, Func <IRequestContext, Object> > services, ThriftCodecManager codecManager, ILoggerFactory loggerFactory) { var processorMap = ImmutableDictionary.CreateBuilder <String, ThriftMethodProcessor>(); foreach (Type serviceType in services.Keys) { ThriftServiceMetadata serviceMetadata = new ThriftServiceMetadata(serviceType, codecManager.Catalog); foreach (ThriftMethodMetadata methodMetadata in serviceMetadata.Methods.Values) { String methodName = methodMetadata.QualifiedName; ThriftMethodProcessor methodProcessor = new ThriftMethodProcessor(services[serviceType], serviceMetadata.Name, methodMetadata, codecManager, loggerFactory); if (processorMap.ContainsKey(methodName)) { throw new ThriftyException($"Multiple ThriftMethod-attributed methods named '{methodMetadata.Name}' found in the given service type '{serviceType.Name}'"); } processorMap.Add(methodName, methodProcessor); } } this.Methods = processorMap.ToImmutableDictionary(); }