예제 #1
0
        /// <summary>
        /// 根据插件类型获取相同类型的所有插件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="models"></param>
        /// <param name="Type"></param>
        /// <returns></returns>
        public static List <T> CreateInstancesByPluginType <T>(this System.Reflection.Assembly[] models, string Type = "") where T : class
        {
            if (ListObject == null)
            {
                ListObject = new Dictionary <string, object>();
            }
            List <T> lstObject = new List <T>();

            foreach (var model in models)
            {
                //System.Threading.Tasks.Parallel.ForEach(models, model =>
                //{
                var types = model.GetTypesByType(Type);
                if (types != null && types.Count > 0)
                {
                    foreach (var type in types)
                    {
                        //System.Threading.Tasks.Parallel.ForEach(types, type =>
                        //{
                        string          assemblyPluginId = model.GetAssemblyPluginAttribute().ID;
                        PluginAttribute pluginAttribute  = type.GetPluginAttribute();
                        string          pluginId         = pluginAttribute.ID;
                        object          obj = null;
                        if (ListObject.ContainsKey(assemblyPluginId.ToLower() + pluginId.ToLower()))
                        {
                            obj = ListObject[assemblyPluginId.ToLower() + pluginId.ToLower()];
                        }
                        if (obj != null)
                        {
                            lstObject.Add(obj as T);
                        }
                        else
                        {
                            obj = type.GetConstructor(new Type[] { }).Invoke(null);
                            //obj = Activator.CreateInstance(type);
                            lstObject.Add(obj as T);
                            if (pluginAttribute.IsSingleInstance)
                            {
                                ListObject.Add(assemblyPluginId.ToLower() + pluginId.ToLower(), obj);
                            }
                        }
                        //});
                    }
                }
                //});
            }
            return(lstObject);
        }
예제 #2
0
        /// <summary>
        /// 根据ID创建对象
        /// </summary>
        /// <param name="models"></param>
        /// <param name="AssemblyId"></param>
        /// <param name="PluginId"></param>
        /// <returns></returns>
        public static object CreateInstanceByAssemblyIdAndPluginId(this System.Reflection.Assembly[] models, string AssemblyId, string PluginId = "")
        {
            object obj = null;

            if (ListObject == null)
            {
                ListObject = new Dictionary <string, object>();
            }
            var existModel = models.GetModelByAssemblyId(AssemblyId);

            if (existModel != null)
            {
                if (String.IsNullOrWhiteSpace(PluginId))
                {
                    PluginId = existModel.GetAssemblyPluginAttribute().DefaultPluginID;
                }
                if (String.IsNullOrWhiteSpace(PluginId))
                {
                    return(null);
                }
                if (ListObject.ContainsKey(AssemblyId.ToLower() + PluginId.ToLower()))
                {
                    obj = ListObject[AssemblyId.ToLower() + PluginId.ToLower()];
                }
                if (obj == null)
                {
                    Type existType = existModel.GetTypeByPluginId(PluginId);
                    if (existType != null)
                    {
                        obj = existType.GetConstructor(new Type[] { }).Invoke(null);
                        //obj = Activator.CreateInstance(existType);
                        if (existType.GetPluginAttribute().IsSingleInstance)
                        {
                            ListObject.Add(AssemblyId.ToLower() + PluginId.ToLower(), obj);
                        }
                    }
                }
            }
            return(obj);
        }