Пример #1
0
 public RegistrationEntry(
     Predicate <Type> typeFilter, IRegistrator registrator, AbstractApplicationContext context)
 {
     _typeFilter  = typeFilter;
     _registrator = registrator;
     _context     = context;
 }
Пример #2
0
        private static void RegisterServices(IServiceCollection services, AbstractApplicationContext applicationContext)
        {
            foreach (var definition in applicationContext.ObjectFactory.GetObjectDefinitionNames().Select(it => new { Name = it, Definition = applicationContext.ObjectFactory.GetObjectDefinition(it) }))
            {
                List <Type> types      = new List <Type>();
                var         interfaces = definition.Definition.ObjectType.GetInterfaces();
                if (interfaces.Any())
                {
                    types.AddRange(interfaces);
                }

                Type currentType = definition.Definition.ObjectType;
                do
                {
                    types.Add(currentType);
                    currentType = currentType.BaseType;
                } while (currentType != typeof(object));


                foreach (var type in types)
                {
                    services.AddTransient(type, (sp) =>
                    {
                        return(applicationContext.GetObject(definition.Name));
                    });
                }
            }
        }
Пример #3
0
        internal static void Adapt(IServiceCollection services, AbstractApplicationContext applicationContext, OptionsBuilder config)
        {
            RegisterServices(services, applicationContext);

            RegisterDefaults(services, applicationContext);

            //RegisterBridges(applicationContext, config);
        }
        public static IAutoRegistration Configure(this AbstractApplicationContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            return(new AutoRegistration(context));
        }
        /// <summary>
        /// 전달된 <paramref name="instance"/> 인스턴스에서 Autowire 특성이 선언된 속성을 Spring Context에 등록하고, 주입합니다.
        /// </summary>
        /// <param name="instance">직접 생성한 인스턴스</param>
        /// <param name="rootContextName"></param>
        public static void Autowire(object instance, string rootContextName = DefaultRootContextName)
        {
            AbstractApplicationContext ctx = GetApplicationContext(rootContextName);

            foreach (AutowireTargetPropertyInfo info in AutowireTargetPropertyGetter.GetAutowireTargetPropertiesInfo(instance.GetType(), null))
            {
                CreateObjectDefinition(ctx, info);
                info.PropertyInfo.SetValue(instance, ctx.GetObject(info.ObjectInfo.Id));
            }
        }
Пример #6
0
        public AutoRegistration(AbstractApplicationContext context)
        {
            _context = context;

            _assemblyIncludeFilters = new List <Predicate <Assembly> >();
            _assemblyExcludeFilters = new List <Predicate <Assembly> >();

            _registrations      = new List <RegistrationEntry>();
            _typeExcludeFilters = new List <Predicate <Type> >();
        }
Пример #7
0
        public void Register(Type type, AbstractApplicationContext context)
        {
            var builder = ObjectDefinitionBuilder.GenericObjectDefinition(type);

            foreach (var action in _actions)
            {
                action(type, builder);
            }

            context.RegisterObjectDefinition(_nameResolver(type), builder.ObjectDefinition);
        }
    private static AbstractApplicationContext CreateAppContext(AbstractApplicationContext configurationContext)
    {
        var containerArgs = new XmlApplicationContextArgs()
        {
            CaseSensitive          = true,
            Name                   = "root",
            ConfigurationLocations = new[] { "assembly://DevWeek.Worker/DevWeek/Container.Config.xml" },
            ParentContext          = configurationContext
        };
        var appContext = new XmlApplicationContext(containerArgs);

        return(appContext);
    }
 /// <summary>
 /// Spring ObjectDefinition을 가져오거나 생성합니다.
 /// </summary>
 /// <param name="ctx"></param>
 /// <param name="info"></param>
 /// <returns></returns>
 private static IObjectDefinition GetOrCreateObjectDefinition(AbstractApplicationContext ctx, AutowireTargetPropertyInfo info)
 {
     if (ctx.IsObjectNameInUse(info.ObjectInfo.Id))
     {
         return(ctx.GetObjectDefinition(info.ObjectInfo.Id));
     }
     else
     {
         AbstractObjectDefinition objectDefinition = fac.CreateObjectDefinition(info.ObjectInfo.Type, null, AppDomain.CurrentDomain);
         objectDefinition.IsSingleton = info.ObjectInfo.Singleton;
         ctx.ObjectFactory.RegisterObjectDefinition(info.ObjectInfo.Id, objectDefinition);
         return(ctx.GetObjectDefinition(info.ObjectInfo.Id));
     }
 }
 private void ResolveTypes()
 {
     m_weather              = Bootstrapper.ResolveType <Weather>();
     m_email                = Bootstrapper.ResolveType <Email>();
     m_calendar             = Bootstrapper.ResolveType <Calendar>();
     m_greetings            = Bootstrapper.ResolveType <Greetings>();
     m_riffSystemOperations = Bootstrapper.ResolveType <RiffSystemOperations>();
     m_clock                = Bootstrapper.ResolveType <Clock>();
     m_outlook              = Bootstrapper.ResolveType <Outlook>();
     m_chrome               = Bootstrapper.ResolveType <Chrome>();
     m_slack                = Bootstrapper.ResolveType <Slack>();
     m_word          = Bootstrapper.ResolveType <Word>();
     m_powerpoint    = Bootstrapper.ResolveType <Powerpoint>();
     m_excel         = Bootstrapper.ResolveType <Excel>();
     m_batteryStatus = Bootstrapper.ResolveType <BatteryStatus>();
     m_googleSearch  = Bootstrapper.ResolveType <GoogleSearch>();
 }
Пример #11
0
        public static void RegisterBridges(AbstractApplicationContext applicationContext, OptionsBuilder config, IServiceCollection services)
        {
            var serviceProvider = services.BuildServiceProvider();

            foreach (var replica in config.Replications)
            {
                if (replica.Singleton)
                {
                    var singletonInstance = serviceProvider.GetService(replica.Type);

                    applicationContext.ObjectFactory.RegisterSingleton(replica.Name, singletonInstance);
                }
                else
                {
                    throw new NotImplementedException("Non singleton replica is not working yet");
                }
            }
        }
        /// <summary>
        /// <paramref name="type"/> 유형과 <paramref name="autowireAttribute"/>의 Autowire 특성을 분석하여 Spring Context에 등록하고, 객체를 생성하여 반환합니다.
        /// </summary>
        /// <param name="type"></param>
        /// <param name="autowireAttribute"></param>
        /// <param name="rootContextName"></param>
        /// <returns></returns>
        public static object Autowire(Type type, AutowireAttribute autowireAttribute, string rootContextName = DefaultRootContextName)
        {
            AbstractApplicationContext ctx = GetApplicationContext(rootContextName);

            if (autowireAttribute == null)
            {
                throw new NullReferenceException("AutowireAttribute missing");
            }

            if (autowireAttribute.Type == null)
            {
                autowireAttribute.Type = type;
            }
            if (string.IsNullOrEmpty(autowireAttribute.ContextName))
            {
                autowireAttribute.ContextName = $"[{type.GetShortAssemblyName()}]{$"Singleton={autowireAttribute.Singleton.ToString().ToLower()}".ToMD5String()}";
            }

            var info = new AutowireTargetPropertyInfo(autowireAttribute, type);

            CreateObjectDefinition(ctx, info);
            return(ctx.GetObject(info.ObjectInfo.Id));
        }
Пример #13
0
 /// <summary>
 /// Registers alias with unique id for object of <c>T</c> type.
 /// </summary>
 /// <typeparam name="T">Type of object returned by alias.</typeparam>
 /// <param name="ctx">Context for the registration</param>
 /// <returns>Next build stage.</returns>
 public static IAliasLinkingBuildStage <T> RegisterUniquelyNamedAlias <T>(this AbstractApplicationContext ctx)
 {
     return(RegisterNamedAlias <T>(ctx, IdGenerator <T> .GetUniqueId()));
 }
Пример #14
0
 private static void RegisterDefaults(IServiceCollection services, AbstractApplicationContext applicationContext)
 {
     applicationContext.ObjectFactory.RegisterSingleton("ServiceProvider", new SpringServiceProvider(applicationContext, services));
     applicationContext.ObjectFactory.RegisterSingleton("SpringServiceScopeFactory", new SpringServiceScopeFactory(applicationContext));
 }
        /// <summary>
        /// <paramref name="info"/> 정보를 분석하여 Spring Context에 등록합니다.
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="info"></param>
        private static void CreateObjectDefinition(AbstractApplicationContext ctx, AutowireTargetPropertyInfo info)
        {
            if (!ctx.IsObjectNameInUse(info.ObjectInfo.Id))
            {
                lock (_lockMap.GetOrAdd(info.ObjectInfo.Id, new object()))
                {
                    if (!ctx.IsObjectNameInUse(info.ObjectInfo.Id))
                    {
                        IObjectDefinition objectDefinition = GetOrCreateObjectDefinition(ctx, info);
                        // 병힙정의 찾기
                        IObjectDefinition mergeTargetObjectDefinition = null;
                        if (!string.IsNullOrEmpty(info.ObjectInfo.PropertyDefinedAutowireAttribute.MergeBase) && ctx.IsObjectNameInUse(info.ObjectInfo.PropertyDefinedAutowireAttribute.MergeBase))
                        {
                            mergeTargetObjectDefinition = ctx.GetObjectDefinition(info.ObjectInfo.PropertyDefinedAutowireAttribute.MergeBase);
                        }

                        // 병합정의가 있는경우 우선 처리
                        if (mergeTargetObjectDefinition != null)
                        {
                            foreach (PropertyValue propertyValue in mergeTargetObjectDefinition.PropertyValues)
                            {
                                if (info.ObjectInfo.ObjectType.GetProperty(propertyValue.Name) != null)
                                {
                                    // 현재 정의에 없다면 등록한다.
                                    if (!objectDefinition.PropertyValues.Contains(propertyValue.Name))
                                    {
                                        objectDefinition.PropertyValues.Add(mergeTargetObjectDefinition.PropertyValues.GetPropertyValue(propertyValue.Name));
                                    }
                                }
                            }
                        }

                        // 현재 정의의 객체나 프로퍼티에 선언된 Property 특성으로 부터 확인된 속성정의를 우선 등록한다.
                        foreach (var confirmedPropAttr in info.ObjectInfo.ConfirmedPropertyAttributes)
                        {
                            // 현재 정의에 이미 존재한다면, 제거하고 새로 등록한다.
                            if (objectDefinition.PropertyValues.Contains(confirmedPropAttr.Name))
                            {
                                objectDefinition.PropertyValues.Remove(objectDefinition.PropertyValues.GetPropertyValue(confirmedPropAttr.Name));
                            }
                            objectDefinition.PropertyValues.Add(confirmedPropAttr.Name, new RuntimeObjectReference(confirmedPropAttr.Ref));
                        }

                        // 현재 정의의 객체에 Autowire 특성을 가지고 있는 프로퍼티
                        foreach (AutowireTargetPropertyInfo inInfo in AutowireTargetPropertyGetter.GetAutowireTargetPropertiesInfo(info.ObjectInfo.ObjectType, info))
                        {
                            // 이미 정의되어 있으나 이 것이 MergeBase에 의한 것이라면 지운다
                            if (objectDefinition.PropertyValues.Contains(inInfo.PropertyInfo.Name))
                            {
                                if (mergeTargetObjectDefinition != null && mergeTargetObjectDefinition.PropertyValues.Contains(inInfo.PropertyInfo.Name))
                                {
                                    objectDefinition.PropertyValues.Remove(objectDefinition.PropertyValues.GetPropertyValue(inInfo.PropertyInfo.Name));
                                }
                            }

                            // 핸재 정의에 존재하지 않는다면 정의를 새로 생성한다.
                            if (!objectDefinition.PropertyValues.Contains(inInfo.PropertyInfo.Name))
                            {
                                CreateObjectDefinition(ctx, inInfo);
                                objectDefinition.PropertyValues.Add(inInfo.PropertyInfo.Name, new RuntimeObjectReference(inInfo.ObjectInfo.Id));
                            }
                        }
                    }
                }
            }
        }
Пример #16
0
 public SpringServiceProvider(AbstractApplicationContext applicationContext, IServiceCollection services)
 {
     this.applicationContext       = applicationContext;
     this.frameworkServiecProvider = services.BuildServiceProvider();
 }
Пример #17
0
 public AliasDefinitionBuilder(AbstractApplicationContext ctx, string alias)
 {
     _ctx   = ctx;
     _alias = alias;
 }
Пример #18
0
 /// <summary>
 /// Registers alias with <c>id</c> for object of <c>T</c> type.
 /// </summary>
 /// <typeparam name="T">Type of object returned by alias.</typeparam>
 /// <param name="ctx">Context for the registration</param>
 /// <param name="id">Alias id.</param>
 /// <returns>Next build stage.</returns>
 public static IAliasLinkingBuildStage <T> RegisterNamedAlias <T>(this AbstractApplicationContext ctx, string id)
 {
     return(new AliasDefinitionBuilder <T>(ctx, id));
 }
 public SpringServiceScopeFactory(AbstractApplicationContext applicationContext)
 {
     this.applicationContext = applicationContext;
 }