public override void Register(IServiceLocatorAdapter adapter, IServiceLocatorStore store, IRegistration registration, ResolutionPipeline pipeline)
        {
            var mappedFromType = registration.GetMappedFromType();
            var mappedToType = registration.GetMappedToType();

            if (mappedFromType != mappedToType)
            {
                adapter.RegisterFactoryMethod(mappedFromType, () => pipeline.Execute(mappedFromType));
                RegisterLazy(adapter, mappedFromType, pipeline);
                adapter.Register(mappedToType, mappedToType);
                RegisterContextual(adapter, mappedToType);
            }
            else
            {
                var serviceLocator = adapter.GetInstance<IServiceLocator>();
                adapter.RegisterFactoryMethod(mappedToType, () =>
                {
                    var instance = serviceLocator.GetInstance(mappedToType, "default." + mappedToType, new IResolutionArgument[0]);
                    return instance;
                });
                serviceLocator.Register(new NamedRegistration(mappedToType, mappedToType, "default." + mappedToType));
            }

            RegisterLazy(adapter, mappedToType, pipeline);
            RegisterTypeResolver(adapter, mappedFromType);
            RegisterContextual(adapter, mappedFromType);
        }
        public override void Register(IServiceLocatorAdapter adapter, IServiceLocatorStore store, IRegistration registration, ResolutionPipeline pipeline)
        {
            var mappedFromType = registration.GetMappedFromType();
            var mappedToType   = registration.GetMappedToType();

            if (mappedFromType != mappedToType)
            {
                adapter.RegisterFactoryMethod(mappedFromType, () => pipeline.Execute(mappedFromType));
                RegisterLazy(adapter, mappedFromType, pipeline);
                adapter.Register(mappedToType, mappedToType);
                RegisterContextual(adapter, mappedToType);
            }
            else
            {
                var serviceLocator = adapter.GetInstance <IServiceLocator>();
                adapter.RegisterFactoryMethod(mappedToType, () =>
                {
                    var instance = serviceLocator.GetInstance(mappedToType, "default." + mappedToType, new IResolutionArgument[0]);
                    return(instance);
                });
                serviceLocator.Register(new NamedRegistration(mappedToType, mappedToType, "default." + mappedToType));
            }

            RegisterLazy(adapter, mappedToType, pipeline);
            RegisterTypeResolver(adapter, mappedFromType);
            RegisterContextual(adapter, mappedFromType);
        }
        protected void RegisterNamedLazy(IServiceLocatorAdapter adapter, Type type, string key)
        {
            var serviceLocator = (IServiceLocator)adapter.GetInstance(typeof (IServiceLocator));
            Type lazyLoader = typeof(Func<,>).MakeGenericType(typeof(string), type);

            Expression<Func<string, object>> func = x => serviceLocator.GetInstance(type, x);
            var parameter = Expression.Parameter(typeof (string), "param1");
            var lambda = Expression.Lambda(lazyLoader, Expression.Convert(Expression.Invoke(func, parameter), type), parameter).Compile();

            adapter.RegisterFactoryMethod(lazyLoader, () => lambda);
        }
Esempio n. 4
0
        protected void RegisterNamedLazy(IServiceLocatorAdapter adapter, Type type, string key)
        {
            var  serviceLocator = (IServiceLocator)adapter.GetInstance(typeof(IServiceLocator));
            Type lazyLoader     = typeof(Func <,>).MakeGenericType(typeof(string), type);

            Expression <Func <string, object> > func = x => serviceLocator.GetInstance(type, x);
            var parameter = Expression.Parameter(typeof(string), "param1");
            var lambda    = Expression.Lambda(lazyLoader, Expression.Convert(Expression.Invoke(func, parameter), type), parameter).Compile();

            adapter.RegisterFactoryMethod(lazyLoader, () => lambda);
        }
Esempio n. 5
0
        protected void RegisterContextual(IServiceLocatorAdapter adapter, Type type)
        {
            var  serviceLocator = (IServiceLocator)adapter.GetInstance(typeof(IServiceLocator));
            Type lazyLoader     = typeof(Func <,>).MakeGenericType(typeof(object), type);

            Expression <Func <object, object> > func = x => serviceLocator.GetInstance(type, new ContextArgument(x));
            var parameter = Expression.Parameter(typeof(object), "param1");
            var lambda    = Expression.Lambda(lazyLoader, Expression.Convert(Expression.Invoke(func, parameter), type), parameter).Compile();

            adapter.RegisterFactoryMethod(lazyLoader, () => lambda);
        }
        protected void RegisterContextual(IServiceLocatorAdapter adapter, Type type)
        {
            var serviceLocator = (IServiceLocator)adapter.GetInstance(typeof(IServiceLocator));
            Type lazyLoader = typeof(Func<,>).MakeGenericType(typeof(object), type);

            Expression<Func<object, object>> func = x => serviceLocator.GetInstance(type, new ContextArgument(x));
            var parameter = Expression.Parameter(typeof(object), "param1");
            var lambda = Expression.Lambda(lazyLoader, Expression.Convert(Expression.Invoke(func, parameter), type), parameter).Compile();

            adapter.RegisterFactoryMethod(lazyLoader, () => lambda);
        }
        protected void RegisterTypeResolver(IServiceLocatorAdapter adapter, Type type)
        {
            Type lazyLoader = typeof(Func<,>).MakeGenericType(typeof(Type), type);
            if (adapter.HasTypeRegistered(lazyLoader)) return;

            var serviceLocator = (IServiceLocator)adapter.GetInstance(typeof(IServiceLocator));

            Expression<Func<object, object>> func = x => serviceLocator.GetInstance((Type)x);
            var parameter = Expression.Parameter(typeof(object), "param1");
            var lambda = Expression.Lambda(lazyLoader, Expression.Convert(Expression.Invoke(func, parameter), type), parameter).Compile();

            adapter.RegisterFactoryMethod(lazyLoader, () => lambda);
        }
Esempio n. 8
0
        protected void RegisterTypeResolver(IServiceLocatorAdapter adapter, Type type)
        {
            Type lazyLoader = typeof(Func <,>).MakeGenericType(typeof(Type), type);

            if (adapter.HasTypeRegistered(lazyLoader))
            {
                return;
            }

            var serviceLocator = (IServiceLocator)adapter.GetInstance(typeof(IServiceLocator));

            Expression <Func <object, object> > func = x => serviceLocator.GetInstance((Type)x);
            var parameter = Expression.Parameter(typeof(object), "param1");
            var lambda    = Expression.Lambda(lazyLoader, Expression.Convert(Expression.Invoke(func, parameter), type), parameter).Compile();

            adapter.RegisterFactoryMethod(lazyLoader, () => lambda);
        }
Esempio n. 9
0
        public object GetInstance(Type type, string key, params IResolutionArgument[] arguments)
        {
            store.Get <IResolutionStore>().Add(new List <IResolutionArgument>(arguments));

            var registrationStore = foundation.StoreFor <NamedRegistrationStore>();

            if (registrationStore.HasRegistrationsForTypeNamed(type, key))
            {
                var registration = registrationStore.GetRegistrationForTypeAndName(type, key);
                return(registration.ResolveWith(serviceLocator, store, postResolutionPipeline));
            }

            var resolutionStore = store.Get <IResolutionStore>();
            var items           = resolutionStore.Items;

            return(serviceLocator.GetInstance(type, key, items.OfType <ConstructorParameter, IResolutionArgument>()));
        }