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); }
/// <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>()); }