位置: 编程技术 - 正文

应用框架的设计与实现.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)

  • 小规模免征增值税额度2023
  • 土地使用税怎么征收标准
  • 零售环节征收消费税标准
  • 不动产租赁税率2023
  • 厂家返点是什么意思
  • 收到投资土地使用权的会计科目
  • 法人转钱入公户怎么做会计分录
  • 对母公司的其他说法
  • 增值税税率调整为9%
  • 营业收入就是开票不含税么
  • 抵扣认证的发票开红字有影响吗
  • 公司车辆承包给个人违法吗
  • 增值税进项税转出文件
  • 研发费用加计扣除条件
  • 法院判罚利息怎么算
  • 实收资本未实缴到位,是否缴纳印花税
  • 营改增转让土地税收政策
  • 营改增后哪些进项不能抵扣
  • 营改增后的民办养老院收入是否含增值税收入?
  • 银行承兑汇票收费
  • 总资产报酬率可以用净利润计算吗
  • 合同到期退房子,租金退吗
  • 税务机关核定的计税价格是否含税
  • 取得免税农产品进项税转出
  • mac怎么打出@符号
  • com2us密码找回
  • 华为鸿蒙系统怎么降级版本
  • 安装下载应用
  • Win10 (21H1)Build 19043.1266更新补丁KB5005611正式版发布:附修复更新内容
  • 电脑老是弹出广告怎么处理
  • 为什么把收入进行舞弊假定
  • 预算会计的核算范围
  • 自建房买卖需要缴哪些费用
  • 喝咖啡的好处和坏处 女性
  • php中header的用法
  • 企业生产经营过程中的在产品属于
  • element ui el-tree
  • 没有以前年度损益调整属于哪类科目
  • 增值税附加税的税率
  • 关于古老的jsp页面的知识汇总(超详细)
  • 最强alpha什么意思
  • 进入微信小程序
  • php常用加密技术
  • php对象是什么类型的数据
  • 交上年企业所得税多少
  • 公司开户限额一般多少
  • 建筑企业营改增之前计税方法
  • 采用工作底稿法编制现金流量表是以工作底稿为
  • 理财产品怎么分类总结
  • 外汇保值业务的特点包括
  • 实收资本期末需要结转吗
  • 每月扣除的公积金怎么查
  • 补缴年报所得税怎么填
  • 增值税专用发票几个点
  • 留底税额账上怎么体现
  • 教材出版 技术咨询服务费
  • 应交税费对应的会计科目
  • 预付款项给供应商合法吗
  • 在MySQL中使用通配符时应该注意的问题
  • win8专业版系统更改电脑设置没反应
  • win8更新win8.1
  • 删除windows用户密码
  • linux中使用grep命令显示包含特殊字符的行
  • linux中使用mkdir命令创建新的目录时
  • 内存故障会不断重启么
  • win8.1进入桌面
  • win10系统打不开jpg图片
  • rundll32exe应用程序错误
  • win8打开运行的快捷键是什么
  • win8操作系统如何安装
  • 缺少系统操作怎么办
  • 在动画制作中一般默认帧数选择为
  • 批处理查找字符中含有等号的子串
  • AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
  • jquery的筛选
  • 深入理解innodb
  • 教师十三薪是什么意思
  • 国税局黑龙江省
  • 无锡国税电子发票怎么开
  • 福建农村社保一个月可以拿多少钱
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设