Ejemplo n.º 1
0
        /// <summary>
        /// 根据在容器中注册的项名称,执行指定的方法。
        /// </summary>
        /// <param name="iocItemKey">注册的项名称</param>
        /// <param name="methodName">要执行的方法名称</param>
        /// <param name="parasType">方法的参数类型数组,例如 new Type[] { typeof(string),typeof(int) }</param>
        /// <param name="parasValue">跟方法参数对应的参数值数组,例如 new object[]{"aaa",999}</param>
        /// <returns>执行方法返回的值</returns>
        public object InvokeMethod(string iocItemKey, string methodName, Type[] parasType, object[] parasValue)
        {
            //foreach (IOCConfigEntity.IOC ioc in IOCConfig.IOCConfigEntity.GroupSet)
            //{
            //    foreach (IocProvider provider in ioc.IocProviderList)
            //    {
            //        if (provider.Key == iocItemKey)
            //        {
            //            return InvokeMethod(provider.Assembly, provider.FullClassName,methodName, parasType, parasValue);
            //        }
            //    }
            //}

            //采用委托简化代码
            IocProvider provider = findProvider(p => p.Key == iocItemKey);

            if (provider != null)
            {
                return(InvokeMethod(provider.Assembly, provider.FullClassName, methodName, parasType, parasValue));
            }
            else
            {
                throw new InvalidOperationException("从注册的所有容器中没有找到指定项的提供程序。");
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 从所有容器名称中寻找指定的提供程序(容器的项名,XPath="/GroupSet/IOC/Add[@Key='iocItemKey']"),如果有多个,返回第一个。
        /// </summary>
        /// <typeparam name="T">指定类型(接口)</typeparam>
        /// <param name="iocName">容器名称</param>
        /// <param name="iocItemKey">容器中的项名称</param>
        /// <returns>提供程序</returns>
        public T GetInstance <T>(string iocItemKey)
        {
            //foreach (IOCConfigEntity.IOC ioc in IOCConfig.IOCConfigEntity.GroupSet)
            //{
            //    foreach (IocProvider provider in ioc.IocProviderList)
            //    {
            //        if (provider.Key == iocItemKey)
            //        {
            //            return (T)GetProviderInstance(provider);
            //        }
            //    }
            //}

            //采用委托简化代码
            IocProvider provider = findProvider(p => p.Key == iocItemKey);

            if (provider != null)
            {
                return((T)GetProviderInstance(provider));
            }
            else
            {
                throw new InvalidOperationException("从注册的所有容器中没有找到符合当前类型的提供程序。");
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 获取提供程序的运行时类型(将通过缓存提升效率)
        /// </summary>
        /// <param name="provider">提供程序</param>
        /// <returns>对象类型</returns>
        public Type GetProviderType(IocProvider provider)
        {
            Type t = null;

            if (dictTypeCache.ContainsKey(provider.FullClassName))
            {
                t = dictTypeCache[provider.FullClassName];
            }
            else
            {
                //缓存可以大大提高效率
                lock (lock_obj)
                {
                    if (dictTypeCache.ContainsKey(provider.FullClassName))
                    {
                        t = dictTypeCache[provider.FullClassName];
                    }
                    else
                    {
                        Assembly assembly = Assembly.Load(provider.Assembly);
                        t = assembly.GetType(provider.FullClassName, true);
                        dictTypeCache.Add(provider.FullClassName, t);
                    }
                }
            }
            return(t);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 根据提供程序获取它的实例
        /// </summary>
        /// <param name="provider">提供程序</param>
        /// <returns>对象实例</returns>
        public object GetProviderInstance(IocProvider provider)
        {
            Type t = GetProviderType(provider);
            //下面的方式稍快
            object o = Activator.CreateInstance(t);

            return(o);

            //下面的方式稍慢
            //object obj = t.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
            //return (T)obj;
        }
Ejemplo n.º 5
0
        /// <summary>
        ///  从所有容器中寻找符合当前指定类型(接口)的第一个提供程序,提供程序信息不能定义在AOP组中
        /// </summary>
        /// <param name="interfaceName"></param>
        /// <returns></returns>
        public object GetInterfaceInstance(string interfaceName)
        {
            IocProvider provider = findProvider(p => p.InterfaceName == interfaceName && p.CurrentIOC.Name != "AOP");

            if (provider != null)
            {
                return(GetProviderInstance(provider));
            }
            else
            {
                throw new InvalidOperationException("在IOC配置文件中没有找到 InterfaceName='" + interfaceName + "' 的具体对象实例配置信息。");
            }
        }
Ejemplo n.º 6
0
        public bool AddIocProvider(String configFileName, string iocName, IocProvider provider)
        {
            XElement xml      = XElement.Load(configFileName);
            XElement groupSet = xml.Element("GroupSet");                   //读取GroupSet节
            IEnumerable <XElement> iOCElements = groupSet.Elements("IOC"); //所有IOC节点
            XElement objIocItem = null;

            foreach (XElement iOCElement in iOCElements)//遍历所有Add节点,生成InterfaceRecord对象
            {
                if ((String)iOCElement.Attribute("Name") == iocName)
                {
                    foreach (IocProvider item in GetIocProviderList(iOCElement, null))
                    {
                        if (item.Key == provider.Key)
                        {
                            return(false);//已经存在,不能添加
                        }
                    }
                    //不存在该Key,添加
                    objIocItem = iOCElement;
                    break;
                }
            }

            if (objIocItem == null)
            {
                //添加IOC节点
                XElement ioc = new XElement("IOC");
                ioc.SetAttributeValue("Name", iocName);
                objIocItem = ioc;
                groupSet.Add(objIocItem);
            }

            XElement newItem = new XElement("Add");

            newItem.SetAttributeValue("Key", provider.Key);
            newItem.SetAttributeValue("InterfaceName", provider.InterfaceName);
            newItem.SetAttributeValue("FullClassName", provider.FullClassName);
            newItem.SetAttributeValue("Assembly", provider.Assembly);

            objIocItem.Add(newItem);
            xml.Save(configFileName);
            return(true);
        }
Ejemplo n.º 7
0
        //<IOC>
        //    <Add Key=""  InterfaceName=""  FullClassName="" Assembly="" />
        //    ...
        //</IOC>
        //读取所有Add节点,返回List<IocProvider>
        public List <IocProvider> GetIocProviderList(XElement iOC, IOCConfigEntity.IOC ioc)
        {
            List <IocProvider> list = new List <IocProvider>();

            IEnumerable <XElement> addElements = iOC.Elements("Add");

            foreach (XElement addElement in addElements)
            {
                IocProvider iocProvider = new IocProvider();

                iocProvider.Key           = (String)addElement.Attribute("Key");
                iocProvider.InterfaceName = (String)addElement.Attribute("InterfaceName");
                iocProvider.FullClassName = (String)addElement.Attribute("FullClassName");
                iocProvider.Assembly      = (String)addElement.Attribute("Assembly");
                iocProvider.CurrentIOC    = ioc;
                list.Add(iocProvider);
            }

            return(list);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 从所有容器中寻找符合当前指定类型(接口)的第一个提供程序
        /// </summary>
        /// <typeparam name="T">指定类型(接口)</typeparam>
        /// <returns>提供程序</returns>
        public T GetInstance <T>()
        {
            //foreach (IOCConfigEntity.IOC ioc in IOCConfig.IOCConfigEntity.GroupSet)
            //{
            //    foreach (IocProvider provider in ioc.IocProviderList )
            //    {
            //        return (T)GetProviderInstance(provider);
            //    }
            //}
            // ProviderCompare cmp = delegate() {return  true; };

            //采用委托简化代码
            string      iName    = this.GetInterfaceName(typeof(T).FullName);
            IocProvider provider = findProvider(p => p.InterfaceName == iName);

            if (provider != null)
            {
                return((T)GetProviderInstance(provider));
            }
            else
            {
                throw new InvalidOperationException("从注册的所有容器中没有找到符合当前类型的提供程序。");
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 增加一个Ioc提供程序的配置
        /// </summary>
        /// <param name="iocName">所在的Ioc名称,没有将添加</param>
        /// <param name="provider">提供程序信息</param>
        /// <returns>添加是否成功</returns>
        public static bool AddIocProvider(string iocName, IocProvider provider)
        {
            IOCConfig config = new IOCConfig();

            return(config.AddIocProvider(ConfigFileName, iocName, provider));
        }