Ejemplo n.º 1
0
 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>();
 }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 4
0
 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);
 }
Ejemplo n.º 5
0
 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;
 }
Ejemplo n.º 7
0
        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);
 }