位置: 编程技术 - 正文

应用框架的设计与实现.net平台--跨领域组件--服务工厂(应用框架的设计方法)

编辑:rootadmin

推荐整理分享应用框架的设计与实现.net平台--跨领域组件--服务工厂(应用框架的设计方法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:应用框架的设计与实现pdf,应用框架设计网页,应用框架的设计方法,应用框架设计网页代码,应用框架设计网页,应用框架的设计方法,应用框架的设计与实现pdf,应用框架的设计与实现pdf,内容如对您有帮助,希望把文章链接给更多的朋友!

定义服务抽象服务构建工厂,使之能够实现实现服务工厂族,针对不同的部署环境进行支持

/// <summary> /// 服务构建工厂接口 /// </summary>public interface IServiceFactory:IDisposable{ /// <summary> /// 上下文环境 /// </summary> string Name { get; } /// <summary> /// 获取一个服务的实例 /// </summary> /// <typeparam name="T">服务类型</typeparam> /// <returns></returns> T GetService<T>() where T : class; /// <summary> /// 根据配置中对应的名称获取服务的实例 /// </summary> /// <typeparam name="T">服务类型</typeparam> /// <param name="name">服务名称</param> /// <returns>服务实例</returns> T GetService<T>(string name) where T : class;}

普通服务构建工厂,通过IOC容器,加载服务层组件:

应用框架的设计与实现.net平台--跨领域组件--服务工厂(应用框架的设计方法)

/// <summary> /// 服务构建工厂 /// </summary> public class ServiceFactory : IServiceFactory { private static Type __serviceAttributeType = typeof(System.ServiceModel.ServiceContractAttribute); private string _lifetime; private IUnityContainer contianer; static bool _loaded; static object _sync = new object(); string path; static Lazy<string> defaultFactoryName = new Lazy<string>(() => { var q = AgileConfiguration.Current.Services.Cast<ServiceElement>(); var item = q.FirstOrDefault(c => c.Assembly == "*"); if (item != null) return item.Factory; else return string.Empty; }); static string GetFactoryName<T>() { var q = AgileConfiguration.Current.Services.Cast<ServiceElement>(); string name = typeof(T).Name; string assembly = typeof(T).Module.Name; assembly = assembly.Substring(0, assembly.Length - 4); var e = q.FirstOrDefault(c => c.Type == name && c.Assembly == assembly); if (e == null) e = q.FirstOrDefault(c => c.Assembly == assembly && (c.Type == "*" || string.IsNullOrEmpty(c.Type))); if (e != null) return e.Factory; else return defaultFactoryName.Value; } static IServiceFactory GetInstance<T>() { string factoryName = GetFactoryName<T>(); if (string.IsNullOrEmpty(factoryName)) return Container.Current.Resolve<IServiceFactory>(); else return Container.Current.Resolve<IServiceFactory>(factoryName); } static ServiceFactory() { InitialFactories(); } static void InitialFactories() { var items = AgileConfiguration.Current.ServiceFactories; var policy = new InterceptionBehavior<PolicyInjectionBehavior>(); var intercptor = new Interceptor<TransparentProxyInterceptor>(); foreach (ServiceFactoryElement item in items) { if (item.Name == "*" && Container.Current.IsRegistered<IServiceFactory>()) Trace.TraceWarning("ServiceFactorytsevice factory " &#; item.Type &#; "has been ironed registed into container."); try { var type = Type.GetType(item.Type, true); if (item.Name != "*") { Container.Current.RegisterType(typeof(IServiceFactory), type, item.Name, GetLifetimeManager(item.Lifetime), new InjectionConstructor(item.Lifetime),policy,intercptor); } else { Container.Current.RegisterType(typeof(IServiceFactory), type, GetLifetimeManager(item.Lifetime), new InjectionConstructor(item.Lifetime), policy, intercptor); } } catch (Exception ex) { throw new InvalidOperationException("regist serivce factory error,make sure configration is correct" &#; item.Type, ex); //) "注册服务工厂错误,请确认配置的类型是否正确:"; } } if (!Container.Current.IsRegistered<IServiceFactory>()) Container.Current.RegisterInstance<IServiceFactory>(new ServiceFactory(string.Empty), new ContainerControlledLifetimeManager()); } /// <summary> /// /// </summary> /// <param name="lifetime"></param> public ServiceFactory(string lifetime) { _lifetime = lifetime; contianer = Container.Current; } void Initial() { if (contianer == null) throw new ObjectDisposedException("ServiceFactory"); if (!_loaded) { lock (_sync) { if (!_loaded) { path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; var dir = new DirectoryInfo(path); var files = dir.GetFiles("*.services.???"); foreach (var file in files) LoadAssemblyFromFile(file); } } _loaded = true; } } private void LoadAssemblyFromFile(FileInfo file) { if (file.Extension == ".dll" || file.Extension == ".exe") { try { Trace.TraceInformation("ServiceFactorytload assembly " &#; file.Name); var types = Assembly.LoadFile(file.FullName).GetTypes().Where(c => c.IsClass && !c.IsAbstract && c.IsPublic); foreach (var item in types) { RegistType(item); } } catch { Trace.TraceError("ServiceFactorytload assembly failed " &#; file.Name); } } } private static LifetimeManager GetLifetimeManager(string lifetime) { if (string.IsNullOrEmpty(lifetime)) lifetime = "default"; if (Container.Current.IsRegistered<LifetimeManager>(lifetime)) return Container.Current.Resolve<LifetimeManager>(lifetime); else return new Microsoft.Practices.Unity.PerResolveLifetimeManager(); } private void RegistType(Type type) { var interfaces = type.GetInterfaces(); var q = interfaces.Where(c => ValidateServiceInterface(c)); if (q.Count() == 0) { Trace.TraceWarning("ServiceFactorytcoud not find any service contract in type of " &#; type.FullName); return; } foreach (var item in q) { if (!this.contianer.IsRegistered(item)) this.contianer.RegisterType(item, type, GetLifetimeManager(_lifetime)); } } private static bool ValidateServiceInterface(Type type) { if (!type.IsInterface) return false; return type.GetCustomAttributes(__serviceAttributeType, false).Length > 0; } /// <summary> /// 获取类型T实例 /// </summary> /// <typeparam name="T">类型</typeparam> /// <returns>T 的实例</returns> public static T GetService<T>() where T : class {#if DEBUG if (!ValidateServiceInterface(typeof(T))) throw new ArgumentException("服务接口必须有ServiceContractAttribute标注");#endif //return GetInstance<T>().GetService<T>(); return GetService<T>(null); }#if License static RempLicense lic = new RempLicense();#endif /// <summary> /// 根据服务在容器中的配置名称从服务容器中获取服务实例 /// </summary> /// <typeparam name="T">服务类型</typeparam> /// <param name="name">服务的名称</param> /// <returns>T的实例</returns> public static T GetService<T>(string name) where T : class {#if DEBUG if (!ValidateServiceInterface(typeof(T))) throw new ArgumentException("服务接口必须有ServiceContractAttribute标注");#endif#if License if (System.Diagnostics.Debugger.IsAttached) throw new NotImplementedException(); if (System.Web.HttpContext.Current != null) lic.Validate(typeof(T));#endif //var serviceName = string.IsNullOrEmpty(name) ? typeof(T).Name : name; return GetInstance<T>().GetService<T>(name); } /// <summary> /// 创建一个工厂 /// </summary> /// <param name="name">工厂名称</param> /// <returns><see cref="IServiceFactory"/></returns> public static IServiceFactory CreateFactory(string name) { if (Container.Current.IsRegistered<IServiceFactory>(name)) return Container.Current.Resolve<IServiceFactory>(name); else return null; } #region IServiceFactory Members T IServiceFactory.GetService<T>() { Initial(); try { return this.contianer.Resolve<T>(); } catch (ResolutionFailedException rf) { throw new InvalidOperationException("构建服务对象错误,请确认'" &#; typeof(T).FullName &#; "'对应的实现Dll是否已经Copy到当前应用程序的bin目录或者运行目录:" &#; path, rf); } } T IServiceFactory.GetService<T>(string name) { Initial(); try { return this.contianer.Resolve<T>(name); } catch (ResolutionFailedException re) { throw new InvalidOperationException("构建服务对象错误,请确认名称为" &#; "name" &#; "的对象'" &#; typeof(T).FullName &#; "'对应的实现Dll是否已经Copy到当前应用程序的bin目录或者运行目录中,并且已经注册", re); } } #endregion void IDisposable.Dispose() { } /// <summary> /// /// </summary> public string Name { get { return "Default"; } } /// <summary> /// 销毁服务 /// </summary> /// <param name="obj"></param> public static void DestroyService(IDisposable obj) { DestroyService(obj, null); } internal static void DestroyService(IDisposable obj, IClientInstrumentationProvider instrumentation) { if (obj == null) return; var client = obj as System.ServiceModel.IClientChannel; if (client != null && client.State == System.ServiceModel.CommunicationState.Faulted) { client.Abort(); if (instrumentation != null) instrumentation.Faulted(); } else { if (instrumentation != null) instrumentation.Closed(); } obj.Dispose(); } }

WCF服务端,客户端服务工厂类,提供服务远程调用:

ublic class ServiceFactory : IServiceFactory { private static readonly IClientInstrumentationProvider _instrumentation; static ServiceFactory() { if (Container.Current.IsRegistered<LifetimeManager>()) { var lm = Container.Current.Resolve<LifetimeManager>(); Container.Current.RegisterType<ClientFactory>(lm); } else Container.Current.RegisterType<ClientFactory>(new ContainerControlledLifetimeManager()); if (Container.Current.IsRegistered<IClientInstrumentationProvider>()) { _instrumentation = Unity.GetClientInstrumentationProvider(); } } string _lifetime; IUnityContainer InnerContainer { get { var val = _manager.GetValue() as IUnityContainer; if (val == null) { val = new UnityContainer(); _manager.SetValue(val); } return val; } } static object _sync = new object(); LifetimeManager _manager ; public ServiceFactory(string lifetime) { _lifetime = lifetime;//container = _manager.ge _manager = GetLifetimeManager(); } public T GetService<T>() where T : class { return GetService<T>(string.Empty); } public T GetService<T>(string name) where T : class { if (InnerContainer == null) throw new ObjectDisposedException("ServiceFactory"); if (string.IsNullOrEmpty(name)) name = typeof(T).Name; var obj = default(T); lock (_sync) { if (InnerContainer.IsRegistered<T>(name)) { obj = InnerContainer.Resolve<T>(name); var channel = obj as IClientChannel; if (Validate(channel)) return obj; } } obj = GetChannel<T>(name); return obj; } private bool Validate(IClientChannel channel) { if (channel == null) return false; try { if (channel.State > CommunicationState.Opened) return false; } catch (ObjectDisposedException) { return false; } return true; } private T GetChannel<T>(string name) where T : class { var obj = default(T); lock (_sync) { if (InnerContainer.IsRegistered<T>(name)) obj = InnerContainer.Resolve<T>(name); var channel = obj as IClientChannel; if (Validate(channel)) return obj; var clientFactory = Container.Current.Resolve<ClientFactory>(); if (ClientConfigHelper.IsEndPointExist(name)) { obj = clientFactory.CreateClient<T>(name); } else { var config = ClientConfigHelper.GetConfig<T>(); var address = config.GetAddress<T>(); if (string.IsNullOrWhiteSpace(address)) throw new ArgumentNullException(string.Format("没有找到EndPoint '{0}'对应的配置,请确认EndPoint是否已经正确配置", typeof(T).FullName)); var binding = RuntimeUnity.GetDefeaultBinding(); obj = clientFactory.CreateClient<T>(binding, new EndpointAddress(address), config.IsBidirectional); } InnerContainer.RegisterInstance<T>(name, obj, GetLifetimeManager()); } return obj; } private LifetimeManager GetLifetimeManager() { //return new ChannelLifeTimeManager(); if (string.IsNullOrEmpty(_lifetime)) return new ChannelLifeTimeManager(); if (Container.Current.IsRegistered<LifetimeManager>(_lifetime)) return Container.Current.Resolve<LifetimeManager>(_lifetime); else return new Microsoft.Practices.Unity.PerResolveLifetimeManager(); } public void Dispose() { InnerContainer.Dispose(); } public static void StartService(string baseAdress, IServiceFilter filter, IEventListener listener, Action<ServiceHost> action, Action<Exception> error = null) { var packages = RuntimeUnity.GetServicePackages(baseAdress); foreach (var p in packages) { try { var runner = new RemoteServiceRunner(); runner.Load(p); var el = new EventListener(); el.Notify &#;= (o, e) => { if (e.Type == "error")error(e.Exception); }; runner.Run(listener ?? el, filter ?? ServiceFilter.Empty); } catch (System.ServiceModel.CommunicationException ce) { throw new NotSupportedException("请确认Net.Tcp Port Sharing Service等服务是否开启,以及服务器配置是否正确。", ce); } catch (Exception ex) { if (error != null) error(ex); } } } #region private methods #endregion public static void CloseService(IDisposable obj) { CloseService(obj, null); } internal static void CloseService(IDisposable obj, IClientInstrumentationProvider instrumentation) { if (instrumentation == null) instrumentation = _instrumentation; var client = obj as System.ServiceModel.IClientChannel; if (client == null) return; if (client.State == System.ServiceModel.CommunicationState.Faulted) { client.Abort(); if (instrumentation != null) instrumentation.Faulted(); } else { client.Close(); if (instrumentation != null) instrumentation.Closed(); } } public string Name { get { return "WCF"; } } public void Teardown() { var lf = _manager as ChannelLifeTimeManager; if (lf == null) return; else lf.TearDown(); } }

Unity中protobuf的使用方法 在移动手机游戏开发中,目前Unity3D已成为比较主流的开发技术。那么对于客户端服务器协议的打解包,我们有3中常用的处理方式:1、自定义结构体:

[置顶] Unity Editor Extensions – Custom Inspectors 转载请注明出处:

Unity3D【火星大战二】 火星大战(二)1、我机发射子弹,打中敌机,当敌机生命为零或飞出界面时消失,如图:2、用到碰撞检测技术,产生碰撞必须满足的两个条件:1、包

标签: 应用框架的设计方法

本文链接地址:https://www.jiuchutong.com/biancheng/375791.html 转载请保留说明!

上一篇:Unity3d 导出ios、android等移动平台阴影效果步骤(unity导出3d模型)

下一篇:Unity中protobuf的使用方法(unityproject)

  • 海产品的增值税税率是多少
  • 税务账是什么意思
  • 代扣代缴增值税是什么意思
  • 个体户和公司的经营范围有区别吗
  • 公司费用票
  • 收到投资款怎么做会计凭证
  • 会计凭证借方和贷方怎么填
  • 收到低值易耗品的专票但未付款
  • 公司债券投资的优缺点
  • 广告业服务收费交税的会计处理怎么做?
  • 交通运输业安全员证
  • 税务局加强企业所得税管理
  • 企业所得税营业税金及附加
  • 票据单据较多,费用报销单一张不够填怎么办?
  • 业务招揽方式
  • 跨年发票如何入账小企业会计准
  • 银行抵押贷款结清后需要解押吗
  • 基金预算收入核算的内容包括
  • 预收购货款的会计分录
  • win10 0×0000007b怎么解决
  • 转账和电汇哪个便宜
  • 行业收购溢价
  • 对于目标文件系统文件过大无法删除
  • 企业注销时无力缴纳社保
  • PHP:apache_getenv()的用法_Apache函数
  • php简单文件管理
  • 借款利息税前扣除需要发票
  • ctu指令
  • php输出隔行变色的表格
  • 零基础舞蹈培训
  • 固定资产处置的三种方式
  • 小规模建筑公司经营范围大全
  • discuz去除底部
  • 增值税专用发票的税率是多少啊
  • 城镇土地使用税每年都要交吗
  • mongodb安装教程图解
  • 对外捐赠非货币性资产的会计处理
  • 托盘入账哪个科目最好
  • 外贸进项税额怎么算
  • 汇总记账凭证账务处理
  • 增值税进项发票不够抵扣怎么办
  • 企业进项是什么意思
  • 股东所有者权益负数
  • 关于职工薪酬的确认和计量下列说法中不正确的是
  • 对公转账个人垫付怎么写
  • 进项税留底怎么处理
  • 不动产租赁按简易计税吗
  • 扣缴个人所得税申报表模板
  • 小规模纳税人购买原材料会计分录
  • 汇算清缴前取得发票可以税前扣除吗
  • 房地产开发企业分为几个等级
  • sqlserver (parse name)字符串截取的方法
  • sql server 2000安装包
  • windows禁止安装
  • mac复制文件路径后怎么粘贴
  • centos账号密码
  • solaris安装软件
  • win8系统计算器快捷键
  • ubuntu中安装vim
  • win10系统最新版用户维护在哪
  • Linux一键安装ftp
  • win10桌面底部
  • linux查看端口数据
  • linux中复制目录到另一个目录的命令
  • linux unix操作系统
  • win10系统更改
  • Ext JS 4实现带week(星期)的日期选择控件(实战二)
  • node.js操作文件
  • 在vue中添加按钮使内容消失
  • linux中scp命令和scp命令用法大全
  • java的file类的常用操作
  • linux shell实战
  • 怎么查看keytab文件
  • typeto
  • 安卓启动器修改
  • recyclerview stableid
  • 惠州市国家税务局张新华简历
  • 贵州房产备案信息查询网
  • 税务局高风险人员有啥影响
  • 局党组中心组成员
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设