예제 #1
0
        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);
        }
예제 #2
0
 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}");
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
        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>();
        }
예제 #7
0
        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);
            }
        }
예제 #8
0
        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)
 {
 }
예제 #10
0
 public ThriftClientManager(ThriftCodecManager codecManager, IThriftClientFactory clientFactory = null, ILoggerFactory loggerFactory = null)
     : this(codecManager, new NiftyClient(), Enumerable.Empty <ThriftClientEventHandler>(), clientFactory, loggerFactory)
 {
 }
예제 #11
0
 public ThriftSerializer(SerializeProtocol protocol = SerializeProtocol.Binary)
 {
     _thriftCodecManager = new ThriftCodecManager();
     this.Protocol       = protocol;
 }
예제 #12
0
        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();
        }