/// <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("从注册的所有容器中没有找到指定项的提供程序。"); } }
/// <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("从注册的所有容器中没有找到符合当前类型的提供程序。"); } }
/// <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); }
/// <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; }
/// <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 + "' 的具体对象实例配置信息。"); } }
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); }
//<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); }
/// <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("从注册的所有容器中没有找到符合当前类型的提供程序。"); } }
/// <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)); }