v9.6.2017.0808   重构正向工程,基于映射表查找数据库字段类型到实体类型的映射
大石头 编写于 2017-08-08 21:38:06
X
using System.ComponentModel;
using NewLife.Model;
using NewLife.Reflection;

namespace System
{
    /// <summary>对象容器助手。扩展方法专用</summary>
    [EditorBrowsable(EditorBrowsableState.Advanced)]
    public static class ObjectContainerHelper
    {
        /// <summary>注册类型和名称</summary>
        /// <typeparam name="TInterface">接口类型</typeparam>
        /// <typeparam name="TImplement">实现类型</typeparam>
        /// <param name="container">对象容器</param>
        /// <param name="id">标识</param>
        /// <param name="priority">优先级</param>
        /// <returns></returns>
        public static IObjectContainer Register<TInterface, TImplement>(this IObjectContainer container, Object id = null, Int32 priority = 0)
        {
            return container.Register(typeof(TInterface), typeof(TImplement), null, id, priority);
        }

        /// <summary>注册类型指定名称的实例</summary>
        /// <typeparam name="TInterface">接口类型</typeparam>
        /// <param name="container">对象容器</param>
        /// <param name="instance">实例</param>
        /// <param name="id">标识</param>
        /// <param name="priority">优先级</param>
        /// <returns></returns>
        public static IObjectContainer Register<TInterface>(this IObjectContainer container, Object instance, Object id = null, Int32 priority = 0)
        {
            return container.Register(typeof(TInterface), null, instance, id, priority);
        }

        /// <summary>解析类型指定名称的实例</summary>
        /// <typeparam name="TInterface">接口类型</typeparam>
        /// <param name="container">对象容器</param>
        /// <param name="id">标识</param>
        /// <param name="extend">扩展。若为ture,name为null而找不到时,采用第一个注册项;name不为null而找不到时,采用null注册项</param>
        /// <returns></returns>
        public static TInterface Resolve<TInterface>(this IObjectContainer container, Object id = null, Boolean extend = false)
        {
            return (TInterface)container.Resolve(typeof(TInterface), id, extend);
        }

        /// <summary>解析类型指定名称的实例</summary>
        /// <typeparam name="TInterface">接口类型</typeparam>
        /// <param name="container">对象容器</param>
        /// <param name="id">标识</param>
        /// <param name="extend">扩展。若为ture,name为null而找不到时,采用第一个注册项;name不为null而找不到时,采用null注册项</param>
        /// <returns></returns>
#if !DEBUG
        public static TInterface ResolveInstance<TInterface>(this IObjectContainer container, Object id = null, Boolean extend = false)
        {
            return (TInterface)container.ResolveInstance(typeof(TInterface), id, extend);
        }
#else
        public static TInterface ResolveInstance<TInterface>(this IObjectContainer container, Object id = null, Boolean extend = false)
        {
            var obj = container.ResolveInstance(typeof(TInterface), id, extend);
            try
            {
                return (TInterface)obj;
            }
            catch (InvalidCastException ex)
            {
                var t = obj.GetType();
                NewLife.Log.XTrace.WriteLine("ObjectType:{0} {1}", t.AssemblyQualifiedName, t.Assembly.Location);
                t = typeof(TInterface);
                NewLife.Log.XTrace.WriteLine("InterfaceType:{0} {1}", t.AssemblyQualifiedName, t.Assembly.Location);
                throw ex;
            }
        }
#endif

        /// <summary>遍历所有程序集的所有类型,自动注册实现了指定接口或基类的类型。如果没有注册任何实现,则默认注册第一个排除类型</summary>
        /// <remarks>自动注册一般用于单实例功能扩展型接口</remarks>
        /// <typeparam name="TInterface">接口类型</typeparam>
        /// <typeparam name="TImplement">要排除的类型,一般是内部默认实现</typeparam>
        /// <param name="container">对象容器</param>
        /// <returns></returns>
        public static IObjectContainer AutoRegister<TInterface, TImplement>(this IObjectContainer container)
        {
            return container.AutoRegister(typeof(TInterface), typeof(TImplement));
        }

        /// <summary>遍历所有程序集的所有类型,自动注册实现了指定接口或基类的类型。如果没有注册任何实现,则默认注册第一个排除类型</summary>
        /// <remarks>自动注册一般用于单实例功能扩展型接口</remarks>
        /// <typeparam name="TInterface">接口类型</typeparam>
        /// <typeparam name="TImplement">要排除的类型,一般是内部默认实现</typeparam>
        /// <param name="container">对象容器</param>
        /// <param name="getidCallback">用于从外部类型对象中获取标识的委托</param>
        /// <param name="id">标识</param>
        /// <param name="priority">优先级</param>
        /// <returns></returns>
        public static IObjectContainer AutoRegister<TInterface, TImplement>(this IObjectContainer container, Func<Object, Object> getidCallback = null, Object id = null, Int32 priority = 0)
        {
            return container.AutoRegister(typeof(TInterface), getidCallback, id, priority, typeof(TImplement));
        }

        /// <summary>解析接口指定名称的实现类型</summary>
        /// <typeparam name="TInterface">接口类型</typeparam>
        /// <param name="container">对象容器</param>
        /// <param name="id">标识</param>
        /// <param name="extend">扩展。若为ture,name为null而找不到时,采用第一个注册项;name不为null而找不到时,采用null注册项</param>
        /// <returns></returns>
        public static Type ResolveType<TInterface>(this IObjectContainer container, Object id = null, Boolean extend = false)
        {
            return container.ResolveType(typeof(TInterface), id, extend);
        }
    }
}