实际项目中使用Postsharp

2023-05-16

 我现在的项目中使用了winform(.net2.0) + asp.net mvc(.net3.5) + sqlserver2000,Orm使用的是Castle的ActiveRecord。客户端与服务器端通信使用的是Ice,可以通过动态代理切换为webservice或者remoting或者直连本地。而在客户端中是不能直接访问实体类中的延迟加载字段的。你可以专门写个服务来查询这种字段,不过用起来有些麻烦。所以在这种场合使用Postsharp来把这个查询操作透明化非常合适,可以使客户端和服务器端操作实体的字段变得一致。Postsharp利用attribute来修饰需要静态织入的类、方法、属性或字段,对于以上需求可以使用OnFieldAccessAspect:
[AttributeUsage(AttributeTargets.Field, Inherited = false), Serializable]
public class LazyLoadAttribute : OnFieldAccessAspect
{}
通过实验发现如果使用AttributeTargets.Property是不能达到效果的。在重载函数OnGetValue(FieldAccessEventArgs eventArgs)中实现调用服务的代码。下面要解决的问题是在后台调用实体的字段时不需要调用查询服务,所以需要在OnGetValue方法中判断当前是运行在客户端还是服务器端。因为我不太喜欢读配置文件,所以使用了硬编码的方式:
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
 if (asm.FullName.StartsWith("GTCA.GCF"))
 {
  //客户端运行
  _Flag = true;
  //加载访问查询服务工具
                Assembly asm_lazy = AppDomain.CurrentDomain.Load("GTCA.GCF.LazyTool");
  //查询接口
                _LazyTool = asm_lazy.CreateInstance("GTCA.GCF.LazyTool.LazyTool") as ILazyTool;
                break;
 }
}
ILazyTool接口是为了使访问查询服务的具体实现可以很灵活:
public interface ILazyTool
{
    object BelongsTo(Type entityType, Guid entityId, string propertyName);
    object HasMany(Type entityType, Guid entityId, string propertyName);
}
后面要做的事就很简单了判断当前的字段是BelongTo的还是HasMany的,然后通过服务获取数据后赋值给该字段eventArgs.ExposedFieldValue = data。
 现在代码写完了只要把[LazyLoad]写在需要的字段上就ok了不过这样不会起任何作用,因为还需要在编译期调用Postsharp的编译工具才能实现静态织入。如果你是直接安装Postsharp会在vs编译c#项目是自动调用Postsharp工具,不过这样不适合在团队开发中使用。因为每个开发人员都要安装Postsharp并且凡是引用了写有[LazyLoad]项目的项目都会在编译时调用一边Postsharp编译工具。向我们项目中Entity中使用了LazyLoad,而Entity项目被一大堆的其他项目引用这样在每次编译时就会很慢(其实是Postsharp编译工具慢)。因此我们还要做点手脚——只有客户端主程序编译时才去调用它。其实Postsharp就是利用MSBuild来在编译期做一些手脚所以我们只要简单修改csproj文件来引入Postsharp的编译工具就ok了。
<PropertyGroup>
 <PostSharpDir>../../../reference/tools/PostSharp 1.5</PostSharpDir>
 <ImportPostSharp>False</ImportPostSharp>
</PropertyGroup>
<Import Project="$(PostSharpDir)/PostSharp-1.5.targets" Condition=" '$(ImportPostSharp)' == 'True' AND Exists('$(PostSharpDir)/PostSharp-1.5.targets')" />
其中PostSharpDir是Postsharp相关dll所在的文件夹,ImportPostSharp是启用Postsharp编译工具的开关默认为关。然后在编译客户端主程序时使用MSBuild命令行来编译项目就行了。
%windir%/microsoft.net/framework/v2.0.50727/msbuild /t:rebuild /property:Configuration=Debug;ImportPostSharp=True
现在就可以卸载掉Postsharp了,你可以在自己的项目中尝试下Postsharp还是比较简单的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实际项目中使用Postsharp 的相关文章

随机推荐

  • DOS那一代的程序员现在都干嘛呢?

    亿友论坛 DOS那一代的程序员现在都干嘛呢 xff1f xff08 几年前的老帖子 xff09 作者 xff1a 包子夹蛋 发布时间 xff1a 2005 5 10 14 01 00 DOS那一代的程序员现在都干嘛呢 xff1f xff08
  • KVM虚拟机掉电重启后无法ssh连接访问

    KVM虚拟机掉电重启无法ssh连接访问 问题描述问题解决过程解决方法 问题描述 KVM虚拟机升级ssh版本后 xff0c 主机因为维护掉电 xff0c 等主机上电后 xff0c 虚拟机重启后 xff0c 再也无法ssh连接访问 问题解决过程
  • 让Ubuntu 18.04系统支持root用户登录的方法

    简介 默认的Ubuntu 18 04系统在登陆界面上是不支持root用户直接登录的 xff0c 但是你可以使用下面的方法让Ubuntu 18 04也支持root登录 通常情况下 xff0c 在Ubuntu 18 04中的普通用户只能通过运行
  • 这十个css动画案例惊艳众人

    大家好 我是前端实验室的大师兄 对于网页设计师和开发工程师而言 xff0c 创建一款极具趣味性和实用性的CSS网页动画 xff0c 能让网站美观不少 CSS动画 xff0c 就是通过CSS代码搭建网页动画 允许设计师和开发人员 xff0c
  • java线程和进程(阻塞队列)

    目录 1 阻塞队列简介 2Java中的阻塞队列 3 阻塞队列的实现原理 4 阻塞队列的使用场景 1 阻塞队列简介 阻塞队列常用于生产者和消费者的场景 xff0c 生产者是往队列里添加元素的线程 xff0c 消费者是从队列里拿元素的线程 阻塞
  • 子类可以重载父类的方法吗?重载会发生父类和子类之间吗?

    不可以 方法重载 xff1a 在同一个类中 xff0c 方法名相同 xff0c 参数列表不同的方法 xff0c 同一个类中 xff01 xff01 xff01 xff0c 子类和父类不是一个类啊 底层原理是方法区加载了子类和父类 xff0c
  • 时间复杂度和空间复杂度(基础,详细)

    前言 算法对于开发人员是非常重要的 xff0c 我们从常见的算法看起 xff0c 比如排序算法 xff0c 排序算法有好几种实现方法 xff0c 最简单的嵌套两个for循环进行排序 xff0c 进阶点就可以用 冒泡排序 xff0c 最终的结
  • 类与类之间的关系

    类之间的关系有 xff1a 泛化 xff08 继承 xff09 实现 关联 聚合 组合 依赖 目录 1 泛化 xff08 Generalization xff09 继承 2 实现 xff08 Realization xff09 3 关联 x
  • Unity调试Android

    Unity调试android xff0c 有两种方式 xff0c 第一种在unity编辑器中查看日志 xff0c 另一种是在android studio查看日志 xff0c 个人比较推荐android studio查看日志 xff0c 主要
  • 一文讲明白Linux中的umask原理及应用

    大家在学习Linux操作系统的时候肯定遇到过umask 大部分的书籍会对umask从原理到各种情况下的应用都讲的非常详细 xff0c 洋洋洒洒一大篇 xff0c 然后呢 然后你就看得云里雾里似乎明白了 xff0c 可是又不太懂这个东西干嘛搞
  • Unity Remote5 使用

    Unity Remote是Unity公司提供的一个移动端同步调试工具 xff0c 在Unity编辑器中以播放模式运行项目时 xff0c 该应用程序将与Unity连接 编辑器的可视输出被发送到设备的屏幕 xff0c 实时输入被发送回Unity
  • 里氏替换原则

    里氏替换原则主要是发生在父类和子类之间 xff0c 说到父类和子类 xff0c 在面向对象的语言中 xff0c 继承是必不可少的 非常优秀的语言机制 xff0c 它有如下优点 xff1a 代码共享 xff0c 减少创建类的代码量 xff0c
  • Android中的Intent

    Android中的Intent可以用来在一个组件中启动App中的另一个组件或者是启动另一个App的组件 xff0c 这里所说的组件指的是Activity Service以及Broadcast 目录 Intent的用途 Intent的类型 I
  • Android中Intent用法详细解释

    Android中一些常见的Intent的习惯用法 xff0c 比如如何通过Intent发送短信 发送邮件 启动摄像机拍照录视频 设置闹铃 打开WIFI设置界面等等 目录 发送短信 发送邮件 打电话 拍照 摄像 发送短信 发送短信的时候 xf
  • Android中的Intent的用法

    文章目录 调用拨号程序发送短信或彩信通过浏览器打开网页发送电子邮件显示地图与路径规划播放多媒体选择图片拍照获取并剪切图片打开手机应用市场安装程序卸载程序进入设置界面 调用拨号程序 span class token comment 调用拨打电
  • oracle vm virtualbox 卸载不了

    只能用很暴力的方法下载了个 Windows Install Clean Up 地址 xff1a https www baidu com s tn 61 02003390 42 hao pg amp wd 61 Windows 20Insta
  • vsftpd服务----配置

    首先安装 Linux 企业版第一张光盘中的vsftpd 2 0 1 5 i386 rpm rpm ivh media cdrom RedHat RPMS vsftpd 3 0 1 5 i386 rpm 启动vsftpd服务 service
  • 排列组合

    排列组合的基本公式为 实现A xff0c C xff0c 并把他们封装称为一个函数 xff0c 之后使用起来就会比较方便 int A int n int m int res 61 1 for int i 61 n i gt n m i re
  • vue3.0常用eslint配置详解 .eslintrc.js

    规则值 34 off 34 或者 0 xff0c 关闭 34 warn 34 或者 1 xff0c 警告 34 error 34 或者 2 xff0c 报错 eslintrc js配置 module span class token pun
  • 实际项目中使用Postsharp

    我现在的项目中使用了winform net2 0 43 asp net mvc net3 5 43 sqlserver2000 xff0c Orm使用的是Castle的ActiveRecord 客户端与服务器端通信使用的是Ice xff0c