Пример #1
0
        private T CreateAndExportService <T>()
        {
            var implementationGenerator = Container.Locate <IServiceImplementationGenerator>();

            var implementationRequest = new ImplementationRequest
            {
                DefaultSerializer   = Serializer,
                ExposeDefaultMethod = ExposeDefaultMethod.PostOnly,
                ClientProvider      = new RpcTestClientProvider(ProcessRequest),
                InterfaceType       = typeof(T)
            };

            var implementationType =
                implementationGenerator.GenerateImplementationForInterface(implementationRequest);

            Container.Configure(c =>
            {
                var strategy = new CompiledExportStrategy(implementationType, Container, c.OwningScope.StrategyCompiler.DefaultStrategyExpressionBuilder);

                strategy.AddExportAs(typeof(T));

                c.AddActivationStrategy(strategy);
            });

            return(Container.Locate <T>());
        }
        public async Task TaskWithValueInterfaceReturnTest(ServiceImplementationGenerator implementationGenerator, IClientSerializer clientSerializer, Fixture fixture)
        {
            var request = new ImplementationRequest
            {
                InterfaceType         = typeof(ITestInterface),
                SingleParameterToBody = true,
                DefaultSerializer     = clientSerializer
            };

            var type = implementationGenerator.GenerateImplementationForInterface(request);

            var testInterface = (ITestInterface)fixture.Locate(type);

            var a = 5;
            var b = 5;

            fixture.Locate <IRpcExecutionService>().ExecuteMethodWithValue <int>(Arg.Any <RpcExecuteInformation>(),
                                                                                 Arg.Any <string>(), Arg.Any <object>(), Arg.Any <CancellationToken?>()).Returns(callInfo =>
            {
                var value = callInfo.ArgAt <object>(2);

                var properties = ReflectionService.GetPropertiesFromObject(value);

                var aValue = (int)properties[nameof(a)];
                var bValue = (int)properties[nameof(b)];

                return(aValue + bValue);
            });


            var value = await testInterface.Add(5, 5);


            Assert.Equal(a + b, value);
        }
Пример #3
0
        /// <inheritdoc />
        public IEnumerable <IActivationStrategy> ProvideExports(IInjectionScope scope, IActivationExpressionRequest request)
        {
            var fullName = request.ActivationType.FullName;

            if ((request.ActivationType.GetTypeInfo().IsInterface ||
                 request.ActivationType.GetTypeInfo().IsAbstract) &&
                _namespaceConfig.Namespaces.Any(proxyNamespace => fullName.StartsWith(proxyNamespace)))
            {
                if (_namespaceConfig.Serializer == null)
                {
                    _namespaceConfig.Serializer = scope.LocateOrDefault <IClientSerializer>();

#if NETCOREAPP3_1
                    _namespaceConfig.Serializer = new JsonClientSerializer();
#endif

                    if (_namespaceConfig.Serializer == null)
                    {
                        throw new Exception("IClientSerializer implementation is not exported");
                    }
                }

                var implementationGenerator = scope.Locate <IServiceImplementationGenerator>();

                var implementationRequest = new ImplementationRequest
                {
                    DefaultSerializer       = _namespaceConfig.Serializer,
                    ExposeDefaultMethod     = ExposeDefaultMethod.PostOnly,
                    ClientProvider          = _clientProvider,
                    InterfaceType           = request.ActivationType,
                    NamingConventionService = _namespaceConfig.NamingConvention
                };

                var implementationType =
                    implementationGenerator.GenerateImplementationForInterface(implementationRequest);

                var strategy = new CompiledExportStrategy(implementationType, scope,
                                                          request.Services.LifestyleExpressionBuilder);

                strategy.AddExportAs(request.ActivationType);

                return(new IActivationStrategy[] { strategy });
            }

            return(Array.Empty <IActivationStrategy>());
        }