位置: 编程技术 - 正文

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

  • 应税项目和非应税项目起征点一样吗
  • 建筑行业预缴增值税可以用进项抵缴吗
  • 个体工商户可以给员工交社保吗
  • 电子税务局上财务制度备案错误是啥意思
  • 核定征收企业如何纳税
  • 营业执照注销还需要交钱吗
  • 房地产业营改增
  • 预付卡销售和充值属于什么费用
  • 考勤扣款是税前还是税后
  • 租金小规模开票税率
  • 跨行转账16万手续费多少
  • 临时工工资个税怎么算
  • 营改增后印花税计税依据文件
  • 物业公司代收暖气费如何开票
  • 总公司与分公司的账务处理销售
  • 年终奖个人所得税怎么扣
  • 保险付款后几天给发票保单
  • 餐饮店收入是销售收入吗
  • 公账的钱如何合法取出会计
  • 固定资产暂估入账后续调整
  • 建筑行业会计成本会计工作流程
  • 华为手机进入recovery模式怎么退出
  • 华为鸿蒙怎么搞
  • 如何禁用Windows10更新
  • win11怎么调整任务栏位置
  • 怎么认定是否为党员
  • 出口退税是怎么退
  • 人力资源服务收入计入什么科目
  • uniapp全局对象
  • 计提个体户经营所得税
  • 混合销售兼营如何纳税
  • 公司年终奖怎么缴税
  • 企业所得税如何计算应纳税所得额
  • 约克郡在哪
  • 无形资产租金计入什么会计科目里
  • php怎么传递参数
  • 什么是重大会计事务所
  • 即征即退进项税转出
  • 只申报个税不交社保
  • nor命令
  • 从农民手中收购烟叶的消费税
  • 技术软件开发
  • 购买电子承兑差额是多少
  • python generation
  • php指定域名访问
  • 报税是按照实际收入还是开票
  • sqlserver存储过程在哪里
  • 小企业会计准则2023电子版
  • 做模具怎么找客户
  • 政府会计制度收回多发工资
  • 当月购买固定资产需要计提吗
  • 小微企业社保代缴
  • 收到投资款证明怎么做账
  • 多交了社保
  • 负担、支付所得的企业
  • 总分类账的依据
  • mysql Community Server 5.7.19安装指南(详细)
  • windows无法启动MySQL80服务
  • winxp任务管理器在哪
  • 组策略 guest
  • 苹果手机价格
  • linux终端记录
  • openbsd 6.9
  • os x yosemite dp5下载地址 os x 10.10 dp5更新内容
  • u盘安装ubuntu找不到硬盘
  • linux cp命令怎么用
  • win8电脑wifi功能消失了
  • 勒索病毒一般勒索多少钱
  • java iterate()用法
  • bash 数值比较
  • unity延迟执行方法
  • unity3d课程
  • javascript含义
  • python中如何去除空格
  • jquery获取php变量
  • 江苏国税电子税务局打印控件
  • 重庆车位过户需要多久时间
  • 一年内在两家公司任职个税汇算清缴
  • 电子税务局在手机上能登录吗
  • 新疆喀什泽普县海拔高度是多少米
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设