/// <summary>
        /// Renders the specified task lists.
        /// </summary>
        /// <param name="taskLists">The task lists.</param>
        /// <param name="mergeRoles">if set to <c>true</c> [merge roles].</param>
        /// <returns></returns>
        private string Render(Dictionary <string, TaskListCollection> taskLists, bool mergeRoles)
        {
            Dictionary <TaskDistiller, TaskListCollection> distillers = new Dictionary <TaskDistiller, TaskListCollection>();
            //按角色分别呈现角色对应的任务列表
            StringBuilder sb = new StringBuilder();

            if (mergeRoles)
            {
                TaskDistiller      distiller = null;
                TaskListCollection list      = new TaskListCollection();
                foreach (string roleName in taskLists.Keys)
                {
                    distiller = GetRoleDistiller(roleName);
                    list.AddRange(taskLists[roleName]);
                }
                sb.Append(distiller.Render.TaskListsToHtml(list.ToArray()));
            }
            else
            {
                foreach (string roleName in taskLists.Keys)
                {
                    TaskDistiller distiller = GetRoleDistiller(roleName);
                    //合并呈现
                    sb.Append(distiller.Render.TaskListsToHtml(taskLists[roleName].ToArray()));
                }
            }
            return(sb.ToString());
        }
        private TaskDistiller InitTaskDistiller(RoleConfigItem config)
        {
            TaskDistiller            taskDistiller = new TaskDistiller();
            List <InstanceDistiller> distillers    = new List <InstanceDistiller>();

            if (config.Distillers != null && config.Distillers.Length != 0)
            {
                //遍历每个实例提取者并加入提取者集合
                foreach (TypeItem item in config.Distillers)
                {
                    InstanceDistiller distiller = (InstanceDistiller)ConfigurationHelper.LoadType(item);
                    if (distiller == null)
                    {
                        throw new ConfigurationErrorsException(string.Format("{0} isn't the type IInstanceDistiller", item.Type));
                    }
                    distillers.Add(distiller);
                }
            }
            taskDistiller.InstanceDistillers = distillers.ToArray();
            //遍历每个过滤器并加入过滤器集合
            List <InstanceFilter> filters = new List <InstanceFilter>();

            if (config.Filters != null && config.Filters.Length != 0)
            {
                foreach (TypeItem item in config.Filters)
                {
                    InstanceFilter filler = (InstanceFilter)ConfigurationHelper.LoadType(item);
                    if (filler == null)
                    {
                        throw new ConfigurationErrorsException(string.Format("{0} isn't the type IInstanceFilter", item.Type));
                    }
                    filters.Add(filler);
                }
            }
            taskDistiller.Filters = filters.ToArray();
            //实例化任务项目提取器
            if (config.TaskItemDistiller != null)
            {
                object obj = ConfigurationHelper.LoadType(config.TaskItemDistiller);
                if (obj.GetType().GetInterface(typeof(ITaskItemDistiller).Name) == null)
                {
                    throw new TypeLoadException(string.Format("Type \"{0}\" does not implement interface ITaskItemDistiller", obj.GetType().FullName));
                }
                taskDistiller.ItemDistiller = (ITaskItemDistiller)obj;
            }
            //实例化呈现器
            if (config.TaskRender != null)
            {
                object obj = ConfigurationHelper.LoadType(config.TaskRender);
                if (obj.GetType().GetInterface(typeof(ITaskRender).Name) == null)
                {
                    throw new TypeLoadException(string.Format("Type \"{0}\" does not implement interface ITaskRender", obj.GetType().FullName));
                }
                taskDistiller.Render = (ITaskRender)obj;
            }
            return(taskDistiller);
        }
        /// <summary>
        /// 获取角色和对应实例集合的键-值对
        /// </summary>
        /// <param name="workflowName">流程名称</param>
        /// <param name="userId">用户Id</param>
        /// <param name="roleName">角色名称</param>
        /// <param name="startDate">时间段起始时间</param>
        /// <param name="endDate">时间段截止时间</param>
        /// <returns></returns>
        private InstanceCollection DistillInstances(string workflowName, string userId, string roleName, DateTime startDate, DateTime endDate)
        {
            IUserIdentity userIdentity = identityService.GetUserIdentity(userId);
            //获取流程对应的审批角色对象,并从角色-提取者字典中获取角色对应的提取者
            InstanceCollection instances = new InstanceCollection();
            ApprovalRole       role      = WorkflowUtility.GetUserRoleByName(workflowName, roleName);

            if (role != null)
            {
                //用户不在该角色
                if (!userInRole.IsUserInRole(userIdentity.GetUserId(), role.Name))
                {
                    throw new ApplicationException(string.Format("{0} is not in role {1}", userIdentity.GetUserId(), role.Name));
                }
                //取得角色的任务提取器
                TaskDistiller distiller = GetRoleDistiller(roleName);
                instances.AddRange(distiller.Distill(workflowName, userIdentity, role, startDate, endDate));
            }
            return(instances);
        }
        /// <summary>
        /// 将角色-实例集合转化为用户的任务列表
        /// </summary>
        /// <param name="userId">用户Id.</param>
        /// <param name="instances">角色-实例集合.</param>
        /// <returns></returns>
        private Dictionary <string, TaskListCollection> ConvertToTasklists(string userId, InstanceCollection instances)
        {
            Dictionary <string, TaskListCollection> taskLists = new Dictionary <string, TaskListCollection>();
            IUserIdentity       userIdentity = identityService.GetUserIdentity(userId);
            List <ApprovalRole> allRoles     = instances.GetAllRoles();

            //按角色分别呈现角色对应的任务列表
            foreach (ApprovalRole role in allRoles)
            {
                InstanceCollection c = instances.GetByRole(role);

                TaskListCollection lists = new TaskListCollection();
                //获取该角色对应的提取器对象
                TaskDistiller distiller = GetRoleDistiller(role.Name);
                distiller.ForRole = role;
                if (distiller.ItemDistiller is IInitializableDistiller)
                {
                    ((IInitializableDistiller)(distiller.ItemDistiller)).Initialize(role, c);
                }

                List <InstanceCollection> collection = c.SplitByEaId();
                foreach (InstanceCollection one in collection)
                {
                    List <ITaskItem> items = new List <ITaskItem>();

                    ITaskItem taskItem = distiller.ItemDistiller.Distill(one, userIdentity);
                    items.Add(taskItem);
                    TaskList list = new TaskList(one.TaskName, items);
                    //给任务列表名称赋值
                    if (!string.IsNullOrEmpty(this.taskName))
                    {
                        list.Cagegory = this.taskName;
                    }
                    lists.Merge(list);
                }
                taskLists.Add(role.Name, lists);
            }
            return(taskLists);
        }
        /// <summary>
        /// Creates a new object that is a copy of the current instance.
        /// </summary>
        /// <returns>
        /// A new object that is a copy of this instance.
        /// </returns>
        internal TaskDistiller Clone()
        {
            TaskDistiller            distiller  = new TaskDistiller();
            List <InstanceDistiller> distillers = new List <InstanceDistiller>();

            foreach (InstanceDistiller o in InstanceDistillers)
            {
                distillers.Add(o.Clone());
            }
            distiller.InstanceDistillers = distillers.ToArray();
            if (Filters != null)
            {
                List <InstanceFilter> filters = new List <InstanceFilter>();
                foreach (InstanceFilter filter in Filters)
                {
                    filters.Add(filter.Clone());
                }
                distiller.Filters = filters.ToArray();
            }
            distiller.ItemDistiller = ItemDistiller;
            distiller.Render        = Render;
            return(distiller);
        }
        /// <summary>
        /// 从RoleConfg项目中生成服务
        /// </summary>
        /// <param name="config">The config.</param>
        /// <param name="applicationName">此TaskService实例对应的应用名称.</param>
        internal TaskService(ServiceConfig config, string applicationName)
            : this()
        {
            //获取该应用的所有工作流名称.
            IWorkFlowDefinePersistService defineService = WorkflowRuntime.Current.GetService <IWorkFlowDefinePersistService>();

            this.workflowNames = defineService.GetAllWorkflowDefineName(applicationName);

            this.taskName   = config.TaskName;
            this.name       = config.Name;
            this.mergeRoles = config.AllMerge;
            if (config.DefaultItem == null)
            {
                throw new ConfigurationErrorsException(string.Format("Cann't found Default roleConfig!"));
            }
            this.defaultDistiller = InitTaskDistiller(config.DefaultItem);
            if (defaultDistiller.InstanceDistillers == null)
            {
                throw new ConfigurationErrorsException(string.Format("default distillers \"{0}\" can not be empty!", config.Name));
            }
            if (defaultDistiller.Filters == null)
            {
                throw new ConfigurationErrorsException(string.Format("default filters \"{0}\" can not be empty!", config.Name));
            }
            if (defaultDistiller.ItemDistiller == null)
            {
                throw new ConfigurationErrorsException(string.Format("default itemDistiller \"{0}\" is not exist!", config.Name));
            }
            if (defaultDistiller.Render == null)
            {
                throw new ConfigurationErrorsException(string.Format("default taskRender \"{0}\" is not exist!", config.Name));
            }
            distillersMap = new Dictionary <string, TaskDistiller>();
            if (config.Items != null && config.Items.Length > 0)
            {
                //遍历每个角色配置项目生成提取者,如果提取者
                foreach (RoleConfigItem item in config.Items)
                {
                    TaskDistiller distiller = InitTaskDistiller(item);
                    //如果提取者集合为空,则使用缺省提取者集合
                    if (distiller.InstanceDistillers == null || distiller.InstanceDistillers.Length == 0)
                    {
                        distiller.InstanceDistillers = defaultDistiller.InstanceDistillers;
                    }
                    //如果过滤器为空,则使用缺省过滤器集合
                    if (distiller.Filters == null || distiller.Filters.Length == 0)
                    {
                        distiller.Filters = defaultDistiller.Filters;
                    }
                    if (distiller.ItemDistiller == null)
                    {
                        distiller.ItemDistiller = defaultDistiller.ItemDistiller;
                    }
                    if (distiller.Render == null)
                    {
                        distiller.Render = defaultDistiller.Render;
                    }
                    if (string.IsNullOrEmpty(item.Name))
                    {
                        throw new ConfigurationErrorsException("");
                    }
                    //把角色字串拆解为角色数组
                    string[] o = item.Name.Split(";,;,".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                    //添加到角色-提取器字典中
                    foreach (string s in o)
                    {
                        if (!distillersMap.ContainsKey(s))
                        {
                            distillersMap[s] = distiller;
                        }
                    }
                }
            }
            //校验角色字典,对不存在角色抛出异常
            List <string> roles = new List <string>(WorkflowUtility.GetAllRoles(applicationName));

            foreach (string key in distillersMap.Keys)
            {
                if (!roles.Contains(key))
                {
                    throw new ConfigurationErrorsException(string.Format("There isn't a role called '{0}' in workflow's definiton files", key));
                }
            }
        }