Example #1
0
        public static object CreateDelegate(Type delegateType, NancyContainer nancyContainer, string serviceName)
        {
            var returnType = delegateType.FunctionReturnType();
            var exps = new Expression[] {
                Expression.Constant(serviceName),
                Expression.Constant(returnType)
            };

            var container = Expression.Constant(nancyContainer);
            var exp = Expression.Call(container, nancyContainer.GetMethod(nc => nc.Resolve(string.Empty, default(Type))), exps);

            var expConvert = Expression.Convert(exp, returnType);

            var g = Expression.Lambda(delegateType, expConvert).Compile();

            return (object)g;
        }
Example #2
0
        public IEnumerable<IRegistration> GetRegistrationsFor(NancyContainer container, Type serviceType)
        {
            if (serviceType != null && serviceType.IsGenericTypeDefinedBy(typeof(Func<>)))
            {
                var baseServiceType = serviceType.FunctionReturnType();
                var baseServiceRegistrations = container.GetRegistrations(baseServiceType, null);

                var newRegistrations = new List<IRegistration>();
                foreach (var registration in baseServiceRegistrations)
                {
                    var factory = FuncGenerator.CreateDelegate(serviceType, container, registration.Name);

                    newRegistrations.Add(new FactoryRegistration(serviceType, c => factory, registration.Name));
                }
                return newRegistrations.AsEnumerable();
            }

            return Enumerable.Empty<IRegistration>();
        }