public GenericHandler(ICodecContainer codecContainer, IRawHandlerFactory delegateFactory, IReadOnlyList<ServiceDescription> serviceDescriptionChain, MethodDescription methodDescription, ServicePath servicePath) { rawHandlers = new ConcurrentDictionary<TypesKey, IHandler>(); createRawHandler = delegateFactory.CreateGenericClass(serviceDescriptionChain, methodDescription, servicePath); genericParameterCount = methodDescription.GenericParameters.Count; typeCodec = codecContainer.GetManualCodecFor<Type>(); }
public Func<Type[], IHandler> CreateGenericClass(IReadOnlyList<ServiceDescription> serviceDescriptionChain, MethodDescription methodDescription, ServicePath path) { var type = CreateType(serviceDescriptionChain, methodDescription, path); if (type.IsGenericType) return t => (IHandler)Activator.CreateInstance(type.MakeGenericType(t), codecContainer); return t => (IHandler)Activator.CreateInstance(type, codecContainer); }
public HandlerClassBuildingContext(IReadOnlyList<ServiceDescription> serviceDescriptionChain, MethodDescription methodDescription, TypeBuilder builder, GenericTypeParameterBuilder[] genericTypeParameterBuilders, HandlerClassFieldCache fields) { ServiceDescriptionChain = serviceDescriptionChain; MethodDescription = methodDescription; Builder = builder; GenericTypeParameterBuilders = genericTypeParameterBuilders; Fields = fields; }
public bool TryGetMethod(string methodName, out MethodDescription description) { for (int i = 0; i < methods.Length; i++) { if (methods[i].Name == methodName) { description = methods[i]; return(true); } } description = null; return(false); }
public bool TryGetMethod(string methodName, out MethodDescription description) { for (int i = 0; i < methods.Length; i++) { if (methods[i].Name == methodName) { description = methods[i]; return true; } } description = null; return false; }
public static bool TryGetMethod(this ServiceDescription service, string name, out MethodDescription method) { method = service.Methods.FirstOrDefault(x => x.Name == name); return method != null; }
private Type CreateType(IReadOnlyList<ServiceDescription> serviceDescriptionChain, MethodDescription methodDescription, ServicePath path) { int disambiguator = Interlocked.Increment(ref classNameDisambiguator); var typeBuilder = moduleBuilder.DefineType("__rpc_handler_" + string.Join(".", path) + "_" + disambiguator, TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Class, typeof(object), new[] { typeof(IHandler) }); var genericTypeParameterBuilders = methodDescription.GenericParameters.Any() ? typeBuilder.DefineGenericParameters(methodDescription.GenericParameters.Select(x => x.Name).ToArray()) : new GenericTypeParameterBuilder[0]; var fieldCache = new HandlerClassFieldCache(typeBuilder); var classContext = new HandlerClassBuildingContext(serviceDescriptionChain, methodDescription, typeBuilder, genericTypeParameterBuilders, fieldCache); CreateMethodDelegate(classContext); CreateConstructor(classContext); return typeBuilder.CreateType(); }
public void BuildSimple() { var fooDesc = new MethodDescription(null, "Foo", new MethodParameterDescription[0]); var barDesc = new MethodDescription(null, "Bar", new MethodParameterDescription[0]); methodDescriptionBuilder.Build(typeof(IFooBar).GetMethod("Foo")).Returns(fooDesc); methodDescriptionBuilder.Build(typeof(IFooBar).GetMethod("Bar")).Returns(barDesc); var desc = builder.Build(typeof (IFooBar)); Assert.That(desc.Type, Is.EqualTo(typeof(IFooBar))); Assert.That(desc.Name, Is.EqualTo("FooBar")); Assert.That(desc.Subservices, Is.Empty); Assert.That(desc.Methods, Is.EquivalentTo(new[] { fooDesc, barDesc })); }
public void PropertiesAreNotMethods() { var fooDesc = new MethodDescription(null, "Foo", new MethodParameterDescription[0]); var barDesc = new MethodDescription(null, "Bar", new MethodParameterDescription[0]); methodDescriptionBuilder.Build(typeof(IFooBar).GetMethod("Foo")).Returns(fooDesc); methodDescriptionBuilder.Build(typeof(IFooBar).GetMethod("Bar")).Returns(barDesc); var desc = builder.Build(typeof(IComplex)); Assert.That(desc.Methods, Is.Empty); }
public void Nested() { var fooDesc = new MethodDescription(null, "Foo", new MethodParameterDescription[0]); var barDesc = new MethodDescription(null, "Bar", new MethodParameterDescription[0]); methodDescriptionBuilder.Build(typeof(IFooBar).GetMethod("Foo")).Returns(fooDesc); methodDescriptionBuilder.Build(typeof(IFooBar).GetMethod("Bar")).Returns(barDesc); var desc = builder.Build(typeof(IComplex)); Assert.That(desc.Subservices.Count, Is.EqualTo(1)); Assert.That(desc.Subservices[0].Name, Is.EqualTo("MyFooBar")); Assert.That(desc.Subservices[0].Service.Name, Is.EqualTo("FooBar")); Assert.That(desc.Subservices[0].Service.Methods, Is.EquivalentTo(new[] { fooDesc, barDesc })); }
public static bool TryGetMethod(this ServiceDescription service, string name, out MethodDescription method) { method = service.Methods.FirstOrDefault(x => x.Name == name); return(method != null); }