Tag: aop

将代码注入到没有自定义属性的所有方法和属性的最简单方法

在Stack Overflow上有很多关于AOP in .NET的问题和解答,经常提到PostSharp和其他第三方产品。 因此,在.NET和C#世界中似乎有相当多的AOP选项。 但是每个都有它们的限制,并且在下载了有希望的PostSharp后, 我在他们的文档中发现“方法必须是虚拟的”才能够注入代码 (编辑:请参阅ChrisWue的答案和我的评论 – 虚拟约束必须有我认为,其中一个竞争者。 我没有进一步研究这个陈述的准确性,但是它的分类性让我回到Stack Overflow。 所以我想回答这个非常具体的问题: 我想在我的项目中没有自定义的 每个方法和属性 (静态,密封,内部,虚拟,非虚拟,无关紧要) 注入简单的 “if(some-condition)Console.WriteLine”样式代码 注释 ,以便在运行时动态测试我的软件。 这个注入的代码不应该保留在发布版本中,它只是用于在开发期间进行动态测试(与线程相关)。 最简单的方法是什么? 我偶然发现Mono.Cecil ,它看起来很理想,除了你似乎必须编写你想在IL中注入的代码。 这不是一个大问题,使用Mono.Cecil很容易获得用C#编写的IL版本的代码。 但是,如果有更简单的东西,理想情况下甚至可以内置到.NET中(我仍然在.NET 3.5上),我想知道。 [更新:如果建议的工具不是.NET Framework的一部分,那么如果它是开源的,如Mono.Cecil,或者免费提供,那就太好了]

在程序集上的PostSharp我没有源代码

在他们网站上的示例中,PostSharp有一个拦截主系统程序集中的调用的演示。 我已经尝试了几次设置和复制所有拦截调用程序集我没有源代码没有成功。 我的方法是简单地将程序集级属性放在我想要检测的命名空间和方法上。 这从来没有对我有用。 就像是: [assembly:Trace(“MyCategory”,AttributeTargetTypes =“My.BusinessLayer。*”)] 我在这里错过了什么吗? 如果我没有为其提供源代码,我是否可以不在程序集上对我的检测方面进行运行时注入? 我以为我可以做运行时注射…… 谢谢。

应用AOP

我一直在使用一些基本的AOP风格解决方案来解决安全性,日志记录,validation等交叉问题。我的解决方案涉及Castle Windsor和DynamicProxy。 我走了这条路,因为我可以使用基于Boo的DSL来应用所有内容,并保持我的代码清除属性。 周末我被告知要看看PostSharp,因为它应该是一个“更好”的解决方案。 我已经快速浏览了PostSharp,但是我被属性使用所拖延了。 有没有人尝试过两种解决方案并愿意分享他们的经验?

dotnet核心中的RealProxy?

我正在使用C#中的AOP名称空间System.Runtime.Remoting.Proxies和System.Runtime.Remoting.Messaging 。 我正在尝试将我的应用程序从.Net Framework 4.6移植到dnxcore / dotnet核心。 Intellisense说,这两个名称空间不适用于我的framework-vesion(netcoreapp1.0 / dnxcore50)。 知道这两个命名空间是否会出现? 或任何想法如何获得像RealProxy类一样的AOP? 我不想使用第三方库 – 我只想使用.Net提供给我的东西。

注入横切关注点的不同方法有哪些?

将横切关注点注入类中的不同方法有哪些,以便在保持代码可测试(TDD或其他)的同时最小化所涉及的类的耦合? 例如,考虑我是否有一个需要日志记录function和集中式exception管理的类。 我应该使用DIP并通过接口将所需的关注点注入需要它们的类中吗? 我应该使用我传递给每个需要一些交叉function的类的服务定位器吗? 是否有完全不同的解决方案? 我完全问错了吗?

如何在运行时替换方法实现?

我想拥有属性getter和方法,我可以用自己的自定义属性进行装饰,并根据该属性的存在,用不同的实现替换方法体。 此外,不同的实现需要知道赋予自定义属性的构造函数参数,在该属性中它装饰方法。 这显然可以通过AOP完成,比如PostSharp或LinFu,但是我想知道是否有一种方法可以做到这一点,不涉及构建后的处理步骤,因为添加使项目更加复杂化。

WCF服务属性用于记录方法调用和exception

我需要在WCF服务中记录每个方法调用,并抛出任何exception。 这导致了许多冗余代码,因为每个方法都需要包含类似于此的样板: [OperationContract] public ResultBase Add(int x, int y) { var parameters = new object[] { x, y } MyInfrastructure.LogStart(“Add”, parameters); try { // actual method body goes here } catch (Exception ex) { MyInfrastructure.LogError(“Add”, parameters, ex); return new ResultBase(“Oops, the request failed”, ex); } MyInfrastructure.LogEnd(“Add”, parameters); } 有没有办法可以将所有这些逻辑封装到MyServiceLoggingBehaviorAttribute属性中,我可以将其应用于服务类(或方法),如下所示: [ServiceContract] [MyServiceLoggingBehavior] public class MyService { […]

如何使用PostSharp属性注入属性?

如何编写PostSharp方面以将属性应用于类? 我正在考虑的场景是需要使用DataContract属性进行修饰的WCF实体(或域对象)。 它还应该有一个Namespace属性。 像这样: using System.Runtime.Serialization; namespace MWS.Contracts.Search.V1 { namespace Domain { [DataContract(Namespace = XmlNamespaces.SchemaNamespace)] public class PagingContext { [DataMember] public int Page { get; set; } [DataMember] public int ResultsPerPage { get; set; } [DataMember] public int MaxResults { get; set; } } } } 在上面的例子中,您可以看到我想要输出的样子。 它具有应用于类的DataContract属性。 手工完成这项工作既乏味又不独特。 我真的只想写一个可以应用于我的“域”命名空间的方面。 然后它将为我应用序列化相关属性。 这样我就可以专注于开发实体对象,而不用担心序列化的细节。 我在PostSharp的网站上找到了用于在方法之前,之后和代替方法注入代码的文档。 然而,我正在寻找的是一种将属性注入类型的方法。 这是解决方案! […]