/// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="service">The service object that is used to invoke methods on</param>
            /// <param name="serviceAttribute">MDSService attribute of service object's class</param>
            public ServiceObject(ApService service, ApServiceAttribute serviceAttribute)
            {
                Service = service;
                ServiceAttribute = serviceAttribute;

                _serviceClassName = service.GetType().Name;

                //Find all methods
                _methods = new SortedList<string, bool>();
                foreach (var methodInfo in Service.GetType().GetMethods())
                {
                    var attributes = methodInfo.GetCustomAttributes(typeof(ApServiceMethodAttribute), true);
                    _methods.Add(methodInfo.Name, attributes.Length > 0);
                }
            }
        /// <summary>
        /// 添加服务类
        /// </summary>
        /// <param name="service">Service to add</param>
        public void AddService(ApService service)
        {
            if (service == null)
            {
                throw new ArgumentNullException("service");
            }

            var type = service.GetType();
            var attributes = type.GetCustomAttributes(typeof (ApServiceAttribute), true);
            if(attributes.Length <= 0)
            {
                throw new Exception("Service class must has ApService attribute to be added.");
            }

            if (_serviceObjects.ContainsKey(type.Name))
            {
                throw new Exception("Service '" + type.Name + "' is already added.");
            }
            service.ServiceApplication = this;
            _serviceObjects.Add(type.Name, new ServiceObject(service, (ApServiceAttribute)attributes[0]));
        }
        /// <summary>
        /// 移除服务类
        /// </summary>
        /// <param name="service">Service to add</param>
        public void RemoveService(ApService service)
        {
            if (service == null)
            {
                throw new ArgumentNullException("service");
            }

            var type = service.GetType();
            if (!_serviceObjects.ContainsKey(type.Name))
            {
                return;
            }

            _serviceObjects.Remove(type.Name);
        }