关于 C# 的 AOP 的建议 [关闭]

2024-02-08

我有一个 ASP.NET 3.5 SP1 Webforms 应用程序。我将 MVP 模式(监督控制器)与 DI (autofac) 结合使用。我的演示者调用我的域 (DDD) 中定义的存储库合约,这些合约在基础设施项目中实现。

演示者调用的存储库方法可能会中断,因此我需要记录异常,然后在视图上设置错误消息。

过去我会添加anotherPresenter 构造函数的参数,将引用存储在 Base Presenter 中,并在我的 Catch 块中调用 Log 方法。我不太喜欢这个,但它可以完成工作。

我可以使用工厂来获取日志记录类如此处所述 http://jeffreypalermo.com/blog/constructor-over-injection-anti-pattern/,但我想先探索一下 AOP,因为它看起来很有趣。

我已经阅读了编译时与运行时 AOP 的内容,我想知道人们对不同解决方案的体验、优点、缺点、建议等。

从我所做的挖掘来看,.NET 中的 AOP 似乎有 4 个主要框架

  • 温莎城堡 - 我一般都远离这个,因为它做了很多我真的不需要的东西
  • Spring.net - 听起来它有良好的记录,但通过它的 xml 配置激发了恐惧(我不喜欢非流畅的配置)
  • PostSharp - 属性驱动(我喜欢这个),但在某一时刻有一些行号问题 https://stackoverflow.com/questions/62798/applying-aop/94083#94083,不确定它们是否仍然存在
  • Unity——一大堆我并不真正需要的东西

I see 另一个问题 https://stackoverflow.com/questions/62798/applying-aop有一些很好的答案,但那是一年半前的事了。同时是否开发了更新的、“更好的”框架,或者应该考虑对现有解决方案进行了增强?

作为参考,我选择 Autofac 进行 DI,因为它流畅、使用简单,找不到任何关于它的负面评论,而且它确实有效。

有关于我应该尝试哪种 AOP 框架的建议吗?感谢您阅读所有这些内容并添加任何想法。


简而言之,为了简单性和易用性,使用 PostSharp 绝对不会出错。

更长的答案:在我看来,您应该根据您想要实现的目标在两个框架之间进行选择。

如果您希望各个方面根据上下文进行更改,请考虑 Spring.NET(或任何在运行时根据配置注入代码的 aop 框架)。这允许您根据您正在做的事情自定义对象的行为。例如,通过您的配置,您可以在控制台应用程序中使用一种日志记录类型,而在 Web 应用程序中使用另一种日志记录类型。请注意,Spring 也是一个 DI 容器(以及其他一些东西)——它远远超出了 AOP,并且绝对值得学习如何使用。

另一方面,如果你想要的行为应该always无论上下文如何,都有效,那么 PostSharp(编译时编织)是您最好的选择。这实际上与您在应用该方面的每个方法中包含代码相同。

对于您正在做的事情,我建议您从 PostSharp 开始。

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

关于 C# 的 AOP 的建议 [关闭] 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 使用 asp.net 发送 20,000 多封电子邮件

    我正在编写一个应用程序 需要向从我们的数据库中选择的学生发送大量电子邮件 每封电子邮件都将进行个性化 包括他们的姓名 学习课程等 因此需要一次发送一个 我可以在 SmtpClient 上循环执行此操作 但我担心我尝试发送的数字最终会遇到超时
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • Sencha Touch - 需要嵌套列表示例

    我需要一个简单的嵌套列表视图示例 类似这样的事情 source roosteronacid com http www roosteronacid com mockup png 当您单击某个项目时 您将过渡 滑动 到包含另一个列表的下一个视图
  • 在 Eclipse“作为小程序运行”中也更改我的小程序的大小

    我目前正在做我的第一个小程序 在测试结果时 我希望能够在预览窗口中的 eclipse 中运行它 而不是总是将小程序部署到 jar 中并在浏览器中打开页面 浏览器缓存杀了我 我总是需要重新启动浏览器 不管怎样 当我尝试使用 运行方式 gt J
  • 为什么不能推断这些泛型类型?

    我有以下代码 public static class CardView public static object Column
  • 如何在 Matplotlib 中为文本添加动画?

    我正在尝试为 Matplotlib 图中的文本框设置动画 但似乎无法使其工作 有谁知道如何正确执行此操作 下面是一个例子 from matplotlib import animation import matplotlib pyplot a
  • 从网络摄像头录制视频流并将 blob 上传到服务器

    所以我有一个网站可以记录来自用户网络摄像头的视频流并将其转换为 blob 使用getUserMedia 我现在想将此 blob 发送到服务器 以便可以保存和处理视频 我在通过 ajax 发送 blob 文件时遇到问题 我尝试过使用 form
  • 如何使用 AJAX 更新选择菜单而不使用表单内的

    我正在使用 ajax 调用来更新选择菜单 ajax 调用通过从不同的 php 文件运行来将列表放入我的选择菜单中 这是 JS 插入片段 if req status 200 document getElementById countydiv
  • Pyplot:共享轴并且子图之间没有空间

    这与 或者更确切地说是后续 有关matplotlib 中共享轴方形子图的新 pythonic 风格 https stackoverflow com questions 13629994 new pythonic style for shar
  • 如何对使用层方法的 lambda 逻辑进行单元测试?

    您好 我有 AWS Lambda 我想为其添加一个层 我希望能够只测试 lambda 的单个方法 然而 其中许多都使用层逻辑 因此在我看来这并不容易 做到这一点的最佳方法是什么 一种方法是封装层 主机位于某处并将其用作依赖项 既然如此 为什
  • Delphi XE - TRibbon 操作始终将焦点发送到 MainForm

    当我将 TRibbon 控件放置在不是应用程序 MainForm 的窗体上时 TRibbon 的操作 即剪切 粘贴 将始终在执行操作后将焦点返回到 MainForm 即使保存 TRibbon 的 TForm 不是 MainForm 的子级
  • “less”命令显示输出所花费的时间

    我有一个可以产生大量输出的脚本 脚本在该点暂停几秒钟T 现在我正在使用less命令来分析脚本的输出 所以我执行 script less 我让它运行足够的时间 以便脚本完成执行 现在 我按 Pg Down 键查看 less 命令的输出 令人惊
  • 使用 pythonpyral 将标签添加到 Rally 缺陷

    我正在尝试使用pyral python 包创建Rally 缺陷 需要添加标签 TestTag2 有没有办法在创建缺陷时添加标签 我正在尝试在创建缺陷后添加标签 但出现以下错误 info Workspace workspace 123 Pro
  • 如何在 ASP.NET Core 中获取 HttpContext.Current.Session?

    我需要将 MVC 项目迁移到 net Core 我知道它已从 ASP net Core 中删除了 System Web 我需要转换 HttpContext Current Session 名称 在 ASP NET Core 中为 Null
  • 访问 Firefox 中的文件下载对话框

    是否有任何类型的 API 可以让我在 Firefox 中操作文件下载对话框 我想访问用户执行某些操作时出现的内容 而不是自己启动的内容 我想做的是从 Selenium 访问这个对话框 我也不确定 Selenium 特权模式 是否足以访问 c
  • MSB3411 无法加载 Visual C++ 组件

    我有 MS Visual Studio 2012 Ultimate 操作系统是 Windows 7 并且安装了 nodeJs 我想使用 npm 安装 socket io 但出现以下错误 C Users NEW gt npm install
  • 哪些标准 C++ 类不能在 C++ 中重新实现?

    我正在查看 C 0x 的计划并发现std initializer list用于在用户类中实现初始值设定项列表 此类无法在 C 中实现 不使用自身 或者使用一些 编译器魔法 如果可以的话 就不需要它了 因为无论您使用什么技术来实现initia
  • 如何屏蔽图片的 Facebook 图形 api URL?

    我正在尝试在我的网站上显示 Facebook 个人资料图片 但不想泄露源中人员的 Facebook ID 例如 这个网址 http graph facebook com 4 picture http graph facebook com 4
  • 具有 MySQL 故障转移功能的 Hibernate Web 应用程序

    我开发了一个 Java Web 应用程序 使用 Hibernate 3 3 2 作为持久性框架 使用 Apache Tomcat 7 0 27 作为服务器 该应用程序已成功设置为使用 MySQL 5 5 复制服务器 1 个主服务器 1 个从
  • 如何将 vtkSphere 保存到 VTK 文件?

    我正在尝试将多个球体保存到一个文件中 以便稍后使用 ParaView 进行可视化 我拥有的是一个文本文件 其中包含有关每个球体的位置和形状 半径 的信息 我正在使用 Python 和 VTK 构建一个文件来可视化 ParaView 中的数据
  • 使用 OR 工具在 python 中进行约束优化:如何强制执行多级约束?

    我有一个优化问题 我有一个 BoolVar 对象列表的列表 所以像这样 BoolVar1 BoolVar2 BoolVar3 BoolVar4 BoolVar5 BoolVar6 我需要评估以下内容 BoolVar1 BoolVar2 Bo
  • 关于 C# 的 AOP 的建议 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi