Exemple #1
0
        /// <summary>
        /// 是否相容的周期
        /// </summary>
        /// <param name="current">当前周期</param>
        /// <param name="target">目标周期</param>
        /// <returns></returns>
        public static string Compatible(this RegisterRule target, RegisterRule current)
        {
            switch (current.LifeStyle)
            {
            /*单例可以注入到任何实例中,其构造只能是单例对象*/
            case ComponentLifeStyle.Singleton:
            {
                return(string.Empty);
            }

            /*短暂只能注入到短暂,其构造可接受任何实例对象*/
            case ComponentLifeStyle.Transient:
            {
                if (target.LifeStyle != ComponentLifeStyle.Transient)
                {
                    return(string.Format("构建当前对象{0}为{1},期望对象{2}为短暂,不能相容",
                                         target.ServiceType.FullName,
                                         target.LifeStyle == ComponentLifeStyle.Scoped ? "作用域" : "单例",
                                         current.ServiceType.FullName));
                }

                return(string.Empty);
            }

            /*作用域其构造不能接受短暂,可接受有作用域和单例*/
            case ComponentLifeStyle.Scoped:
            {
                if (target.LifeStyle == ComponentLifeStyle.Singleton)
                {
                    return(string.Format("构建当前对象{0}为单例,期望对象{1}为作用域,不能相容",
                                         target.ServiceType.FullName,
                                         current.ServiceType.FullName));
                }

                return(string.Empty);
            }
            }

            return(string.Empty);
        }
Exemple #2
0
        /// <summary>
        /// 最优匹配
        /// </summary>
        /// <param name="topRule"></param>
        /// <param name="collection"></param>
        /// <returns></returns>
        internal static RegisterRule LastCompatible(this RegisterRule topRule, IEnumerable <RegisterRule> collection)
        {
            if (collection == null)
            {
                return(null);
            }

            for (var i = collection.Count() - 1; i >= 0; i--)
            {
                var rule = collection.ElementAt(i);
                if (rule.Builded || rule.OptionalBuilded)
                {
                    return(rule);
                }

                if ((rule.ImplementationType.IsInterface || rule.ImplementationType.IsAbstract))
                {
                    continue;
                }
            }

            return(collection.LastOrDefault());
        }
        private void RegisterRule(RegisterRule <TWorkspace, TData> obj)
        {
            var rule = obj.Rule;

            rule.Init(Context, _workspace);
        }
Exemple #4
0
        /// <summary>
        /// 最优匹配
        /// </summary>
        /// <param name="topRule"></param>
        /// <param name="collection"></param>
        /// <returns></returns>
        internal static RegisterRule OptionalCompatible(this RegisterRule topRule, IEnumerable <RegisterRule> collection)
        {
            if (collection == null)
            {
                return(null);
            }

            switch (topRule.LifeStyle)
            {
            case ComponentLifeStyle.Singleton:
            {
                var first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.LifeStyle == ComponentLifeStyle.Singleton && o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.LifeStyle == ComponentLifeStyle.Singleton);
                if (first != null)
                {
                    return(first);
                }

                first = first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.LifeStyle == ComponentLifeStyle.Scoped);
                if (first != null)
                {
                    return(first);
                }
            }
            break;

            case ComponentLifeStyle.Scoped:
            {
                var first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.LifeStyle == ComponentLifeStyle.Singleton && o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.LifeStyle == ComponentLifeStyle.Scoped && o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.LifeStyle != ComponentLifeStyle.Transient);
                if (first != null)
                {
                    return(first);
                }
            }
            break;

            case ComponentLifeStyle.Transient:
            {
                var first = collection.FirstOrDefault(o => o.Key.IsNullOrEmpty() && o.Builded);
                if (first != null)
                {
                    return(first);
                }
            }
            break;
            }

            switch (topRule.LifeStyle)
            {
            case ComponentLifeStyle.Singleton:
            {
                var first = collection.FirstOrDefault(o => o.LifeStyle == ComponentLifeStyle.Singleton && o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = collection.FirstOrDefault(o => o.LifeStyle == ComponentLifeStyle.Singleton);
                if (first != null)
                {
                    return(first);
                }

                first = first = collection.FirstOrDefault(o => o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = collection.FirstOrDefault(o => o.LifeStyle == ComponentLifeStyle.Scoped);
                if (first != null)
                {
                    return(first);
                }

                return(collection.FirstOrDefault());
            }

            case ComponentLifeStyle.Scoped:
            {
                var first = collection.FirstOrDefault(o => o.LifeStyle == ComponentLifeStyle.Singleton && o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = collection.FirstOrDefault(o => o.LifeStyle == ComponentLifeStyle.Scoped && o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = first = collection.FirstOrDefault(o => o.Builded);
                if (first != null)
                {
                    return(first);
                }

                first = collection.FirstOrDefault(o => o.LifeStyle != ComponentLifeStyle.Transient);
                if (first != null)
                {
                    return(first);
                }

                return(collection.FirstOrDefault());
            }

            case ComponentLifeStyle.Transient:
            {
                var first = collection.FirstOrDefault(o => o.Builded);
                if (first != null)
                {
                    return(first);
                }

                return(collection.FirstOrDefault());
            }
            }

            return(null);
        }