コード例 #1
0
        /// <summary>
        /// 从配置文件中读取数据
        /// </summary>
        /// <param name="doc">配置文件</param>
        /// <returns>配置数据</returns>
        private static InjectionModel GetDataFromXml(XmlDocument doc)
        {
            var model = new InjectionModel();

            foreach (XmlNode node in doc.DocumentElement.SelectSingleNode("modules").ChildNodes)
            {
                if (!(node is XmlComment))
                {
                    var module = new InjectionModuleModel
                    {
                        Name     = node.Attributes["name"]?.Value,
                        Assembly = node.Attributes["assembly"]?.Value,
                        Class    = node.Attributes["class"]?.Value
                    };

                    if (string.IsNullOrWhiteSpace(module.Name))
                    {
                        //如果名称为空, 随便起一个名
                        module.Name = Guid.NewGuid().ToString();
                    }

                    foreach (XmlNode p_node in node.ChildNodes)
                    {
                        if (!(p_node is XmlComment))
                        {
                            var parameter = new InjectionParameterModel
                            {
                                Name  = p_node.Attributes["name"]?.Value,
                                Ref   = p_node.Attributes["ref"]?.Value,
                                Value = p_node.Attributes["value"]?.Value,
                            };

                            switch (p_node.Name)
                            {
                            case "constructor":
                                //构造参数
                                module.ConstructorList.Add(parameter);
                                break;

                            case "property":
                                //待注入属性
                                module.PropertyList.Add(parameter);
                                break;

                            default: break;
                            }
                        }
                    }

                    model.Modules.Add(module);
                }
            }
            return(model);
        }
コード例 #2
0
        /// <summary>
        /// 实例化模块
        /// </summary>
        /// <param name="module">待注入模块信息</param>
        /// <param name="parameters">模块实例化参数集合</param>
        /// <returns>实例化模块对象</returns>
        private static object InstantiationModule(InjectionModuleModel module, Dictionary <string, object> parameters)
        {
            var assembly = Assembly.Load(module.Assembly);

            if (assembly == null)
            {
                throw new EntryPointNotFoundException($"{module.Name}模块加载异常",
                                                      new System.Exception("未找到指定的程序集"));
            }
            var type = assembly.GetType(module.Class);

            if (type == null)
            {
                throw new EntryPointNotFoundException($"{module.Name}模块加载异常",
                                                      new System.Exception("未找到指定的模块"));
            }

            foreach (var constructor in
                     type.GetConstructors().Where(
                         constructor => constructor.GetParameters().Count() <= parameters.Count).OrderByDescending(
                         constructor => constructor.GetParameters().Count()))
            {
                var paramsList = new List <object>();
                foreach (var parameter in constructor.GetParameters())
                {
                    if (parameters.ContainsKey(parameter.Name))
                    {
                        if (parameter.ParameterType.IsInterface)
                        {
                            //接口直接注入
                            paramsList.Add(parameters[parameter.Name]);
                        }
                        else
                        {
                            //非接口参数要进行格式转换
                            paramsList.Add(parameters[parameter.Name].ToType(parameter.ParameterType));
                        }
                    }
                    else
                    {
                        //如果没有匹配成功, 查找下一个实例化方法
                        continue;
                    }
                }
                return(constructor.Invoke(paramsList.ToArray()));
            }

            throw new EntryPointNotFoundException($"{module.Name}模块加载异常",
                                                  new System.Exception("未找到匹配的构造函数"));
        }