• 实现一个服务的基础结构和管理本地服务和WCF服务的管理器


    最近实现了一个管理本地服务和WCF服务的管理器:

    1.用户控制服务的一组基础结构

    namespace Practices.Services.Core
    {
        [DataContract]
        public enum ServiceStatus
        {
            Available,
            Running,
            Pause,
            Stoped

      }

    }

    namespace Practices.Services.Core
    {
        [ServiceContract]
        public interface IServiceControler
        {
            [OperationContract]
            ServiceStatus GetServiceStatus();

            [OperationContract]
            void SetServiceStatus(ServiceStatus serviceStatus);
        }
    }

    namespace Practices.Services.Core
    {
        [ServiceContract]
        public interface ICacheControler
        {
            bool Cacheable
            {
                get;
            }

            string PoolName
            {
                get;
                set;
            }

            [OperationContract]
            void Cache();

            EventHandler Cacheing
            {
                get;
                set;
            }
        }
    }

    2.一个实现了基础结构的服务基类

    namespace Practices.Services.Core
    {
        public class BaseServiceControler : MarshalByRefObject,IServiceControler,ICacheControler
        {
            #region Private Members
            private string m_PoolName;
            private EventHandler m_Cacheing;
            private static Dictionary<Type, ServiceStatus> s_ServiceStatus = new Dictionary<Type, ServiceStatus>();
            #endregion

            public BaseServiceControler()
            {
                lock (s_ServiceStatus)
                {
                    if (!s_ServiceStatus.ContainsKey(this.GetType()))
                    {
                        s_ServiceStatus.Add(this.GetType(),ServiceStatus.Running);
                    }
                }
            }

            #region IServiceControler Members
            public ServiceStatus GetServiceStatus()
            {
                return s_ServiceStatus[this.GetType()];
            }

            public void SetServiceStatus(ServiceStatus serviceStatus)
            {
                s_ServiceStatus[this.GetType()] = serviceStatus;
            }
            #endregion

            #region ICacheControler Members
            public bool Cacheable
            {
                get
                {
                    return true;
                }
            }

            public string PoolName
            {
                get
                {
                    return m_PoolName;
                }
                set
                {
                    m_PoolName = value;
                }
            }

            public void Cache()
            {
                if (Cacheable)
                {
                    if (m_Cacheing != null)
                    {
                        m_Cacheing(this, EventArgs.Empty);
                    }
                }
            }

            public EventHandler Cacheing
            {
                get
                {
                    return m_Cacheing;
                }
                set
                {
                     m_Cacheing = value;
                }
            }
            #endregion
        }
    }

    Helper:

    namespace Practices.Services.Core
    {
        public static class TypeResolver
        {
            public static Type ResolveType(string path, string typeString, AppDomain workerDomain)
            {
                Logger.WriteLog("TypeResolver",
                                string.Format("ResolveType in {0}",
                                              workerDomain == null
                                                  ? "Current"
                                                  : workerDomain.Id + ", " + workerDomain.FriendlyName));
                string[] types = typeString.Split(',');

                try
                {
                    if (workerDomain == null)
                    {
                        if (string.IsNullOrEmpty(path))
                        {
                            return Assembly.Load(types[1]).GetType(types[0]);
                        }
                        return
                            Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, types[1])).GetType(
                                types[0]);
                    }
                    return workerDomain.Load(types[1]).GetType(types[0]);
                }
                catch (FileNotFoundException fileEx)
                {
                    throw new TypeResolverException(String.Format("Can not find Assembly file[{0}].", types[1]), fileEx);
                }
                catch (FileLoadException fileEx)
                {
                    throw new TypeResolverException(String.Format("Can not load Assembly file[{0}].", types[1]), fileEx);
                }
            }

            public static object CreateInstance(string path, string typeString, AppDomain workerDomain, object[] args)
            {
                Logger.WriteLog("TypeResolver",
                                string.Format("CreateInstance in {0}",
                                              workerDomain == null
                                                  ? "Current"
                                                  : workerDomain.Id + ", " + workerDomain.FriendlyName));
                string[] types = typeString.Split(',');

                try
                {
                    if (workerDomain == null)
                    {
                        if (string.IsNullOrEmpty(path))
                        {
                            return Assembly.Load(types[1]).CreateInstance(types[0], true, BindingFlags.Default, null, args,
                                                                          null, null);
                        }
                        return
                            Assembly.LoadFrom(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, types[1])).
                                CreateInstance(types[0], true, BindingFlags.Default, null, args, null, null);
                    }
                    return workerDomain.CreateInstanceAndUnwrap(types[1], types[0], true, BindingFlags.Default, null, args,
                                                                null, null, null);
                }
                catch (FileNotFoundException fileEx)
                {
                    throw new TypeResolverException(String.Format("Can not find Assembly file[{0}].", types[1]), fileEx);
                }
                catch (FileLoadException fileEx)
                {
                    throw new TypeResolverException(String.Format("Can not load Assembly file[{0}].", types[1]), fileEx);
                }
            }
        }
    }

    namespace Practices.Services.Core

    {
        public static class Logger
        {
            public static void WriteLog(string service,string eventName)
            {
                Console.WriteLine(DateTime.Now.ToString("MM/dd HH:mm:ss ") + string.Format("T: [{2}], D: [{1}], S: [{0}] E: [{3}]",
                                              service, AppDomain.CurrentDomain.Id + ", " + AppDomain.CurrentDomain.FriendlyName,
                                              Thread.CurrentThread.ManagedThreadId, eventName));
            }
        }
    }

    namespace Practices.Services.Core
    {
        public class TypeResolverException : ApplicationException
        {
            public TypeResolverException()
            {
            }

            public TypeResolverException(string message)
                : base(message)
            {
            }

            public TypeResolverException(string message, Exception innerException)
                : base(message, innerException)
            {
            }

            public TypeResolverException(SerializationInfo info, StreamingContext context)
                : base(info, context)
            {

            }
        }
    }

    3.一个用于管理服务的服务(可以管理本地服务或WCF远程服务,可以实现Cache,更进一步也可以实现负载均衡)

    接口定义:

    namespace Practices.Services.ServiceManagers.Contracts
    {
        [ServiceContract]
        public interface IServiceManager
        {
            #region Info Getting
            [OperationContract]
            List<string> GetServiceGroups();

            [OperationContract]
            List<ServiceInfo> GetServiceInfos(string groupName);

            #endregion

            #region ServiceNanagement
            [OperationContract]
            Object GetService(string groupName, string serviceName, Dictionary<string, Object> parameters, AppDomain workerDomain);
            #endregion

            #region Chache Management
            [OperationContract]
            void ClearChache();

            [OperationContract]
            void ClearChache(string poolName);
            #endregion

        }
    }

    namespace Practices.Services.ServiceManagers.Contracts
    {
        public interface IServiceFactory
        {
            Object CreateService(IServiceManager serviceManager, Dictionary<string, Object> parameters, AppDomain workerDomain);
        }
    }

    namespace Practices.Services.ServiceManagers.Contracts
    {
        public class ServiceInfo
        {
            public string Name
            { get; set; }

            public string Factory
            { get; set; }

            public string Pooling
            { get; set; }

            public string Singleton
            { get; set; }

            public Dictionary<string, Object> Parameters
            { get; set; }

        }

    }

    namespace Practices.Services.ServiceManagers.Contracts
    {
        public class ServiceManagerException:ApplicationException
        {
            public ServiceManagerException()
            {
            }

            public ServiceManagerException(string message)
                : base(message)
            {
            }

            public ServiceManagerException(string message,Exception innerException)
                : base(message, innerException)
            {
            }

            public ServiceManagerException(SerializationInfo info, StreamingContext context)
                : base(info, context)
            {

            }

        }
    }

    本地实现:

    <?xml version="1.0" encoding="utf-8" ?>
    <ServiceModel>
     <ServiceGroups>
      <ServiceGroup name ="Dispacher">
       <Services>
        <Service name="OCREntryDispacher" factory ="OCREntryDispacherFactory" pooling="false" singleton="false" >
         <Parameters>

          <Parameter name ="path" value ="Test.OCREntry"/>
          <Parameter name ="type" value ="Test.OCREntryDispacher,Test"/>
          <Parameter name ="GroupName" value ="OCREntry"/>
          <Parameter name ="BatchSize" value="100"/>
          <Parameter name ="ThreadCount" value="1" />
         </Parameters>
        </Service>
       </Services>
      </ServiceGroup>
      <ServiceGroup name ="OCREntry">
       <Services>
        <Service name="1.00.00" factory ="OCREntryFactory" pooling="false" singleton="false" >
         <Parameters>

          <Parameter name ="path" value ="Test.OCREntry\1.00.00"/>
          <Parameter name ="processor" value="Test.OCREntry,Test"/>
          <Parameter name ="processorUser" value="XXX" />
         </Parameters>
        </Service>
       </Services>
      </ServiceGroup>
      </ServiceGroups>
     <Factories>
      <Factory name="ParameterObjectFactory" type="Practices.Service.ServiceManager.LocalServiceManager.ParameterObjectFactory,Practices.Service.ServiceManager.LocalServiceManager"/>
      <Factory name="CommonObjectFactory" type="Practices.Service.ServiceManager.LocalServiceManager.CommonObjectFactory,Practices.Service.ServiceManager.LocalServiceManager" />
      <Factory name="WCFClientFactory" type="Practices.Service.ServiceManager.LocalServiceManager.WCFClientFactory,Practices.Service.ServiceManager.LocalServiceManager" />
     </Factories>
    </ServiceModel>

    namespace Practices.Services.ServiceManagers.Local
    {

        public class LocalServiceManager : ServiceBase, IServiceManager
        {
            #region Private Property

            private static ServiceGroupDictionary ServiceGroups
            {
                get { return ServiceModelRepository.GetServiceModel().ServiceGroups; }
            }

            private static FactoryDictionary ServiceFactories
            {
                get { return ServiceModelRepository.GetServiceModel().Factories; }
            }

            #endregion

            #region IServiceManager Members

            public List<string> GetServiceGroups()
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);
                return ServiceGroups.Select(group => group.Name).ToList();
            }

            public List<ServiceInfo> GetServiceInfos(string groupName)
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);
                if (!ServiceGroups.Contains(groupName))
                    throw new ServiceManagerException(String.Format("Get Service Names[[{0}]]: Can not find group .",
                                                                    groupName));

                return
                    ServiceGroups[groupName].Services.Select(service => CreateServiceInfo(service)).ToList();
            }

            public object GetService(string groupName, string serviceName, Dictionary<string, object> parameters,
                                     AppDomain workerDomain)
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);

                if (!ServiceGroups.Contains(groupName))
                    throw new ServiceManagerException(String.Format("Get Group[[{0}]]: Can not find group .", groupName));

                ServiceGroup serviceGroup = ServiceGroups[groupName];
                if (!serviceGroup.Services.Contains(serviceName))
                    throw new ServiceManagerException(String.Format("Get Service[[{0}]]: Can not find service .",
                                                                    serviceName));

                Service service = serviceGroup.Services[serviceName];
                if (!ServiceFactories.Contains(service.Factory))
                    throw new ServiceManagerException(String.Format("Get Factory[[{0}]]: Can not find factory .",
                                                                    service.Factory));

                Factory factory = ServiceFactories[service.Factory];
                return GetService(service, parameters, factory, workerDomain);
            }

            public void ClearChache()
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);
                ObjectCacheManager.ClearChache();
            }

            public void ClearChache(string poolName)
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);
                ObjectCacheManager.ClearChache(poolName);
            }

            #endregion

            #region Helper Method

            private Object GetService(Service service, Dictionary<string, object> parameters, Factory factory,
                                      AppDomain workerDomain)
            {
                if (service.SingleTon
                    || service.Pooling)
                {
                    object obj = ObjectCacheManager.GetObject(service.Name, service.SingleTon);
                    if (obj != null) return obj;
                }

                var serviceFactory = (IServiceFactory) TypeResolver.CreateInstance(string.Empty, factory.Type, null, null);
                parameters = service.Parameters.ToDictionary(parameters);
                object result = serviceFactory.CreateService(this, parameters, workerDomain);

                if (service.SingleTon
                    || service.Pooling)
                {
                    ObjectCacheManager.PutObject(service.Name, service.SingleTon, result);
                }

                return result;
            }

            private static ServiceInfo CreateServiceInfo(Service service)
            {
                return new ServiceInfo
                           {
              Name = service.Name,

              Factory = service.Factory,           

              Pooling = service.Pooling,

              Singleton = service.Singleton,                          

              Parameters = service.Parameters.ToDictionary(new Dictionary<string, Object>())
                           };
            }

            #endregion
        }

    }

    HELPER:

    namespace Practices.Services.ServiceManagers.Local
    {
        internal static class ObjectCacheManager
        {
            #region Private Fields
            private static readonly Dictionary<string, List<Object>> s_ObjectCachePools =
                new Dictionary<string, List<Object>>();
            #endregion

            #region Public Methods
            public static object GetObject(string poolName, bool singleTon)
            {
                object result = null;
                if (singleTon)
                {
                    lock (s_ObjectCachePools)
                    {
                        if (s_ObjectCachePools.ContainsKey(poolName)
                            && s_ObjectCachePools[poolName].Count > 0)
                        {
                            result = s_ObjectCachePools[poolName][0];
                        }
                    }
                }
                else
                {
                    lock (s_ObjectCachePools)
                    {
                        if (s_ObjectCachePools.ContainsKey(poolName)
                            && s_ObjectCachePools[poolName].Count > 0)
                        {
                            result = s_ObjectCachePools[poolName][0];
                            s_ObjectCachePools[poolName].RemoveAt(0);
                        }
                    }
                }
                return result;
            }

            public static void PutObject(string poolName, bool singleTon, object result)
            {
                if (singleTon)
                {
                    lock (s_ObjectCachePools)
                    {
                        if (!s_ObjectCachePools.ContainsKey(poolName))
                        {
                            s_ObjectCachePools.Add(poolName, new List<Object>());
                        }

                        s_ObjectCachePools[poolName].Add(result);
                    }
                }
                var cacheControler = result as ICacheControler;
                if (cacheControler != null
                    && cacheControler.Cacheable)
                {
                    cacheControler.PoolName = poolName;
                    cacheControler.Cacheing += Service_Cacheing;
                }
            }

            public static void ClearChache()
            {
                lock (s_ObjectCachePools)
                {
                    s_ObjectCachePools.Clear();
                }
            }

            public static void ClearChache(string poolName)
            {
                lock (s_ObjectCachePools)
                {
                    if (s_ObjectCachePools.ContainsKey(poolName))
                    {
                        s_ObjectCachePools.Remove(poolName);
                    }
                }
            }
            #endregion

            #region Event Handler
            private static void Service_Cacheing(object sender, EventArgs e)
            {
                var cacheControler = sender as ICacheControler;
                if (cacheControler != null && cacheControler.PoolName != "")
                {
                    lock (s_ObjectCachePools)
                    {
                        if (!s_ObjectCachePools.ContainsKey(cacheControler.PoolName))
                        {
                            s_ObjectCachePools.Add(cacheControler.PoolName, new List<Object>());
                        }

                        s_ObjectCachePools[cacheControler.PoolName].Add(sender);
                    }
                }
            }
            #endregion
        }
    }

    MODEL:

    namespace Practices.Services.ServiceManagers.Local.Model
    {
        [Serializable]
        public class FactoryDictionary : KeyedCollection<string, Factory>
        {
            #region Override Member
            protected override string GetKeyForItem(Factory item)
            {
                return item.Name;
            }
            #endregion

            #region Constructor Member
            public FactoryDictionary()
            {

            }

            public FactoryDictionary(IEnumerable<Factory> factoryDictionary)
            {
                foreach (Factory factory in factoryDictionary)
                {
                    Items.Add(new Factory(factory));
                }
            }
            #endregion
        }

        [Serializable]
        public class Factory
        {
            #region Constructor Member
            public Factory()
            {
            }

            public Factory(Factory factory)
            {
                Name = factory.Name;
                Type = factory.Type;
            }
            #endregion

            #region Public Property
            [XmlAttribute("name")]
            public string Name { get; set; }

            [XmlAttribute("type")]
            public string Type { get; set; }
            #endregion
        }
    }

    namespace Practices.Services.ServiceManagers.Local.Model
    {
        [Serializable]
        public class ParameterDictionary : KeyedCollection<string, Parameter>
        {
            #region Override Member
            protected override string GetKeyForItem(Parameter item)
            {
                return item.Name;
            }
            #endregion

            #region Constructor Member
            public ParameterDictionary()
            {

            }

            public ParameterDictionary(IEnumerable<Parameter> parameterDictionary)
            {
                foreach (Parameter parameter in parameterDictionary)
                {
                    Items.Add(new Parameter(parameter));
                }
            }
            #endregion

            #region Public Member
            public Dictionary<string,Object> ToDictionary(Dictionary<string,Object> parameters)
            {
                Dictionary<string, Object> returnParameter = parameters ?? new Dictionary<string, object>();
                foreach (Parameter item in Items)
                {
                    if (!returnParameter.ContainsKey(item.Name))
                    {
                        returnParameter[item.Name] = item.Value;
                    }
                }
                return returnParameter;
            }
            #endregion
        }

        [Serializable]
        public class Parameter
        {
            #region Constructor Member
            public Parameter()
            {
            }

            public Parameter(Parameter parameter)
            {
                Name = parameter.Name;
                Value = parameter.Value;
            }
            #endregion

            #region Public Property
            [XmlAttribute("name")]
            public string Name { get; set; }

            [XmlAttribute("value")]
            public string Value { get; set; }
            #endregion
        }
    }

    namespace Practices.Services.ServiceManagers.Local.Model
    {
        [Serializable]
        public class ServiceDictionary : KeyedCollection<string, Service>
        {
            #region Override Member
            protected override string GetKeyForItem(Service item)
            {
                return item.Name;
            }
            #endregion

            #region Constructor Member
            public ServiceDictionary()
            {

            }

            public ServiceDictionary(IEnumerable<Service> serviceDictionary)
            {
                foreach (Service service in serviceDictionary)
                {
                    Items.Add(new Service(service));
                }
            }
            #endregion
        }

        [Serializable]
        public class Service
        {
            #region Constructor Member
            public Service()
            {
                Parameters = new ParameterDictionary();
            }

            public Service(Service service)
            {
                Name = service.Name;
                Factory = service.Factory;
                Pooling = service.Pooling;
                SingleTon = service.SingleTon;
                Parameters = new ParameterDictionary(service.Parameters);
            }
            #endregion

            #region Public Property
            [XmlAttribute("name")]
            public string Name { get; set; }

            [XmlAttribute("factory")]
            public string Factory { get; set; }
           
            [XmlAttribute("pooling")]
            public bool Pooling { get; set; }

            [XmlAttribute("singleton")]
            public bool SingleTon { get; set; }

            [XmlArray("Parameters")]
            [XmlArrayItem("Parameter")]
            public ParameterDictionary Parameters { get; set; }
            #endregion
        }
    }

    namespace Practices.Services.ServiceManagers.Local.Model
    {
        [Serializable]
        public class ServiceGroupDictionary : KeyedCollection<string, ServiceGroup>
        {
            #region Override Member
            protected override string GetKeyForItem(ServiceGroup item)
            {
                return item.Name;
            }
            #endregion

            #region Constructor Member
            public ServiceGroupDictionary()
            {

            }

            public ServiceGroupDictionary(IEnumerable<ServiceGroup> serviceGroupDictionary)
            {
                foreach (ServiceGroup serviceGroup in serviceGroupDictionary)
                {
                    Items.Add(new ServiceGroup(serviceGroup));
                }
            }
            #endregion
        }

        [Serializable]
        public class ServiceGroup
        {
            #region Constructor Member
            public ServiceGroup()
            {
                Services = new ServiceDictionary();
            }

            public ServiceGroup(ServiceGroup serviceGroup)
            {
                Name = serviceGroup.Name;
                Services = new ServiceDictionary(serviceGroup.Services);
            }
            #endregion

            #region Public Property
            [XmlAttribute("name")]
            public string Name { get; set; }

            public ServiceDictionary Services
            { get; set; }
            #endregion
        }
    }

    namespace Practices.Services.ServiceManagers.Local.Model
    {
        [Serializable]
        public class ServiceModel
        {
            #region Constructor Member
            public ServiceModel()
            {
                ServiceGroups = new ServiceGroupDictionary();
                Factories = new FactoryDictionary();
            }

            public ServiceModel(ServiceModel serviceModel)
            {
                ServiceGroups = new ServiceGroupDictionary(serviceModel.ServiceGroups);
                Factories = new FactoryDictionary(serviceModel.Factories);
            }
            #endregion

            #region Public Property
            [XmlArray("ServiceGroups")]
            [XmlArrayItem("ServiceGroup")]
            public ServiceGroupDictionary ServiceGroups
            { get; set; }

            [XmlArray("Factories")]
            [XmlArrayItem("Factory")]
            public FactoryDictionary Factories
            { get; set; }
            #endregion
        }
    }

    namespace Practices.Services.ServiceManagers.Local.Model
    {
        public static class ServiceModelRepository
        {
            #region Static Members
            private static readonly ServiceModel s_ServiceModel;
            #endregion

            #region Static Constructor
            static ServiceModelRepository()
            {
                s_ServiceModel = Load(GetConfigFilePath());
            }
            #endregion

            #region Public Methods
            public static ServiceModel GetServiceModel()
            {
                return s_ServiceModel;
            }

            public static void SaveServiceModel()
            {
                return Save(s_ServiceModel,GetConfigFilePath());
            }
            #endregion

            #region Private Static Methods
            private static ServiceModel Load(string fileName)
            {
                if (!File.Exists(fileName))
                {
                    throw new ApplicationException("Load ServiceModel:Can not find the file " + fileName);
                }
                try
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(ServiceModel));
                    using (XmlTextReader reader = new XmlTextReader(fileName))
                    {
                        return serializer.Deserialize(reader) as ServiceModel;
                    }
                }
                catch (Exception ex)
                {
                    throw new ServiceManagerException("Load ServiceModel:" + ex.Message);
                }
            }

            private static void Save(ServiceModel serviceModel, String fileName)
            {
                try
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(ServiceModel));
                    using (XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.UTF8))
                    {
                        serializer.Serialize(writer, serviceModel);
                    }
                }
                catch (Exception ex)
                {
                    throw new ServiceManagerException("Save ServiceModel:" + ex.Message);
                }
            }

            private static string GetConfigFilePath()
            {
                Uri url = new Uri(Path.GetDirectoryName(typeof(ServiceModelRepository).Assembly.CodeBase));
                return Path.Combine(url.LocalPath, "LocalServiceManager.config");
            }
            #endregion
        }
    }

    FACTORY:

    namespace Practices.Services.ServiceManagers.Local
    {
        public class CommonObjectFactory : IServiceFactory
        {
            #region IServiceFactory Members
            public object CreateService(IServiceManager serviceManager, Dictionary<string, Object> parameters, AppDomain workerDomain)
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);

                string path = parameters["path"].ToString();
                string typeString = parameters["type"].ToString();
                return TypeResolver.CreateInstance(path, typeString, workerDomain, null);
            }
            #endregion
        }
    }

    namespace Practices.Services.ServiceManagers.Local
    {
        public class WCFClientFactory:IServiceFactory
        {
            #region IServiceFactory Members
            public object CreateService(IServiceManager serviceManager, Dictionary<string, Object> parameters, AppDomain workerDomain)
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);

                string url = parameters["url"].ToString();

                string path = parameters["path"].ToString();
                string typeString = parameters["contracttype"].ToString();

                Type contractType = TypeResolver.ResolveType(path, typeString, null);

                return CreateWCFClient(contractType,url);
            }

            private object CreateWCFClient(Type contractType, string url)
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);

                Type channelFactoryGenericType = typeof (ChannelFactory<>).MakeGenericType(new[] {contractType});
                MethodInfo method = channelFactoryGenericType.GetMethod("CreateChannel",
                                                                        new[]
                                                                            {
                                                                                typeof (System.ServiceModel.Channels.Binding
                                                                                    ),
                                                                                typeof (EndpointAddress)
                                                                            });
                return method.Invoke(null, new Object[] {new NetTcpBinding(), new EndpointAddress(url)});
            }

            #endregion
        }
    }

    namespace Practices.Services.ServiceManagers.Local
    {
        public class ParameterObjectFactory : IServiceFactory
        {
            #region IServiceFactory Members
            public object CreateService(IServiceManager serviceManager, Dictionary<string, Object> parameters, AppDomain workerDomain)
            {
                Logger.WriteLog(GetType().Name, new StackFrame().GetMethod().Name);

                string path = parameters["path"].ToString();
                string typeString = parameters["type"].ToString();
                return TypeResolver.CreateInstance(path, typeString, workerDomain, new object[] { parameters });
            }
            #endregion
        }
    }

  • 相关阅读:
    java接口对入参的判断校验
    sqlyog使用技巧
    mysql 数据库的表中复制一条数据并添加到该表中
    union all ,union 注意事项,查询结果集中的字段名称顺序必须一致
    IDEA连接mysq数据库,其实很简单
    git版本回退、git远程分支管理、git本地分支管理、git生产代码bug修复
    Vue上拉加载下拉刷新---vue-easyrefresh
    Flutter上拉加载下拉刷新---flutter_easyrefresh
    vue-cli webpack多Html页面的配置(附框架vue-webpack-multipage实例)
    Qt使用镜像源快速安装与更新
  • 原文地址:https://www.cnblogs.com/zanxiaofeng/p/1715132.html
Copyright © 2020-2023  润新知