很长一段时间,哪里工作紧急,哪里需要帮助,我就得往哪冲。工作了N年时间,经历和很多事情,想明白了一些事情,心态也好了很多。我想不论在什么公司,不论做什么工作,我们都可以从中获取些东西,都有机会实现我们的价值,关键是心态。前几天刚解决了几个问题,这不又来了一个问题。
 /// <summary>
/// <summary>
 /// 开启服务
        /// 开启服务
 /// </summary>
        /// </summary>
 /// <param name="serviceType"></param>
        /// <param name="serviceType"></param>
 public void StartService(System.Type serviceType)
        public void StartService(System.Type serviceType)
 {
        {
 TypeReflect reflect = new TypeReflect();
            TypeReflect reflect = new TypeReflect();
 ServiceAttribute sa = reflect.GetServiceAttribute<ServiceAttribute>(serviceType);
            ServiceAttribute sa = reflect.GetServiceAttribute<ServiceAttribute>(serviceType);

 if (sc != null)
            if (sc != null)
 {
            {
 MarshalByRefObject serviceObj = System.Activator.CreateInstance(serviceType) as MarshalByRefObject;
                MarshalByRefObject serviceObj = System.Activator.CreateInstance(serviceType) as MarshalByRefObject;

 if (serviceObj != null)
                if (serviceObj != null)
 {
                {
 string key = serviceType.FullName + "_" + sa.Version;
                    string key = serviceType.FullName + "_" + sa.Version;
 if (serviceObjectTable.Keys.Contains(key) == false)
                    if (serviceObjectTable.Keys.Contains(key) == false)
 {
                    {
 serviceObjectTable.Add(key, serviceObj);
                         serviceObjectTable.Add(key, serviceObj);

 RemotingServices.Marshal(serviceObj, key);
                         RemotingServices.Marshal(serviceObj, key);
 }
                    }
 }
                }
 }
            }
 }
        }

 /// <summary>
        /// <summary>
 /// 停止服务
        /// 停止服务
 /// </summary>
        /// </summary>
 /// <param name="serviceType"></param>
        /// <param name="serviceType"></param>
 public void StopService(System.Type serviceType)
        public void StopService(System.Type serviceType) 
 {
        {
 TypeReflect reflect = new TypeReflect();
            TypeReflect reflect = new TypeReflect();
 ServiceAttribute sa = reflect.GetServiceAttribute<ServiceAttribute>(serviceType);
            ServiceAttribute sa = reflect.GetServiceAttribute<ServiceAttribute>(serviceType);

 string key = serviceType.FullName + "_" + sa.Version;
            string key = serviceType.FullName + "_" + sa.Version;

 if (serviceObjectTable.Keys.Contains(key))
            if (serviceObjectTable.Keys.Contains(key))
 {
            {                
 RemotingServices.Disconnect(serviceObjectTable[key]);
                RemotingServices.Disconnect(serviceObjectTable[key]);
 serviceObjectTable.Remove(key);
                serviceObjectTable.Remove(key);                 
 }
            }
 }
        }
其实最主要的步骤就是 :
启动:MarshalByRefObject serviceObj = System.Activator.CreateInstance(serviceType) as MarshalByRefObject;
RemotingServices.Marshal(serviceObj, key);
停止:
RemotingServices.Disconnect(_ServiceObjectTable[key]);
   公司有一个系统,使用Remoting实现分布式通信。服务端用于管理远程服务,完成注册和注销等工作。因为对于服务端的控制要求并不是很高,所以以前在实现注册和注销功能时都需要重新启动服务端,从而重新加载最新的服务。如果是配置一次两次还不觉得什么,可是如果改动很多,特别是开发期间注册新的服务,则很不方便,需要重启N次服务端。于是,工作就来了:要求改造控制单个服务而不影响其他服务或者重新启动系统。
   
    
因为是针对每个服务的控制,不希望在控制一个服务的时候,影响其他的服务,所以在这里使用了RemotingServices.Disconnect,而没有使用注销信道的方法ChannelServices.UnregisterChannel。
    
为了实现这个功能,定义了一个ServiceContainer类,有一个服务集合变量IDictionary<string,MarshalByRefObject> serviceObjectTable,用于缓存在服务端启动的服务对象。我还定义两个方法StartService和StopService方法,实现分别如下:
      
 /// <summary>
/// <summary> /// 开启服务
        /// 开启服务 /// </summary>
        /// </summary> /// <param name="serviceType"></param>
        /// <param name="serviceType"></param> public void StartService(System.Type serviceType)
        public void StartService(System.Type serviceType) {
        { TypeReflect reflect = new TypeReflect();
            TypeReflect reflect = new TypeReflect(); ServiceAttribute sa = reflect.GetServiceAttribute<ServiceAttribute>(serviceType);
            ServiceAttribute sa = reflect.GetServiceAttribute<ServiceAttribute>(serviceType);
 if (sc != null)
            if (sc != null) {
            { MarshalByRefObject serviceObj = System.Activator.CreateInstance(serviceType) as MarshalByRefObject;
                MarshalByRefObject serviceObj = System.Activator.CreateInstance(serviceType) as MarshalByRefObject;
 if (serviceObj != null)
                if (serviceObj != null) {
                { string key = serviceType.FullName + "_" + sa.Version;
                    string key = serviceType.FullName + "_" + sa.Version; if (serviceObjectTable.Keys.Contains(key) == false)
                    if (serviceObjectTable.Keys.Contains(key) == false) {
                    { serviceObjectTable.Add(key, serviceObj);
                         serviceObjectTable.Add(key, serviceObj);
 RemotingServices.Marshal(serviceObj, key);
                         RemotingServices.Marshal(serviceObj, key); }
                    } }
                } }
            } }
        }
 /// <summary>
        /// <summary> /// 停止服务
        /// 停止服务 /// </summary>
        /// </summary> /// <param name="serviceType"></param>
        /// <param name="serviceType"></param> public void StopService(System.Type serviceType)
        public void StopService(System.Type serviceType)  {
        { TypeReflect reflect = new TypeReflect();
            TypeReflect reflect = new TypeReflect(); ServiceAttribute sa = reflect.GetServiceAttribute<ServiceAttribute>(serviceType);
            ServiceAttribute sa = reflect.GetServiceAttribute<ServiceAttribute>(serviceType);
 string key = serviceType.FullName + "_" + sa.Version;
            string key = serviceType.FullName + "_" + sa.Version;
 if (serviceObjectTable.Keys.Contains(key))
            if (serviceObjectTable.Keys.Contains(key)) {
            {                 RemotingServices.Disconnect(serviceObjectTable[key]);
                RemotingServices.Disconnect(serviceObjectTable[key]); serviceObjectTable.Remove(key);
                serviceObjectTable.Remove(key);                  }
            } }
        }其实最主要的步骤就是 :
启动:MarshalByRefObject serviceObj = System.Activator.CreateInstance(serviceType) as MarshalByRefObject;
RemotingServices.Marshal(serviceObj, key);
停止:
RemotingServices.Disconnect(_ServiceObjectTable[key]);
 
                     
                    
                 
                    
                 


 
             
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号