Tag: aop

PostSharp如何在运行时知道某个方面是否应用于某个方法?

我正在实现PostSharp方面库,无法找到解决以下问题的方法。 假设我们有一个方面将应用于某些方法,而不会应用于其他方法。 我需要一些机制,我可以在运行时使用它来知道方面是否应用于方法。 具体来说, 在运行时确定某个方面是否应用于System.Reflection.MethodBase给定的特定方法的推荐方法是什么? 我想到的第一个解决方案是使PostSharp标记每个已被此方面修改的方法,并使用自定义属性并在运行时使用methodBase.CustomAttributes 。 这是解决问题的正确方法吗? 或者在PostSharp中已经有一个现成的或更优雅的解决方案。 另外,请注意首选的解决方案不需要付费的PostSharp许可证,因为Free Community Edition足以支持我当前的项目。 无论如何,讨论基于付费PostSharpfunction的解决方案也是非常有意义的。

Microsoft Unity – xml代码

有人可以提供我应该与企业库4.1中的Microsoft Unity应用程序块一起使用的XML配置,以实现与以下相同的结果吗? using System; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.InterceptionExtension; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { IUnityContainer container = new UnityContainer(); container.AddNewExtension(); container.RegisterType(); container.Configure().SetInterceptorFor(new InterfaceInterceptor()); var logger = container.Resolve(); logger.Write(“World.”); Console.ReadKey(); } } public interface ILogger { [Test] void Write(string message); } public class Logger : ILogger { public void Write(string message) […]

AOP缓存与温莎城堡

任何人都可以提供一个工作示例,说明如何使用Castle Windsor进行缓存。 我假设作为一个起点,我定义了从IInterceptorinheritance的CacheAspect,如下所示: public class CacheAspect : IInterceptor { public void Intercept(IInvocation invocation) { // Code here to check if data is in cache and if so // put that into invocation.ReturnValue… job done! // If not then invoke the method invocation.Proceed(); // Now cache the result of the invocation } } 然后我可以使用我的CacheAspect来装饰任何方法…… [Interceptor(typeof(CacheAspect))] public […]

如何在DI Frameworks中使用AOP和C#TestFrameworks? (不适用于被测物品)

我提前为一个可怕的标题道歉 – 建议欢迎! 我一直在读DI和AOP,我想我掌握了基础知识; 至少对于添加日志记录的规范示例。 我想将它应用于我们在NUnit中创建的测试用例,例如能够为所有测试用例方法和他们调用的任何“帮助方法”自动添加入口/出口日志记录。 (而且我没有与NUnit联系 – 如果在另一个框架中更容易,请告诉我。) 注意 – 这不是关于被测试的主题; 我想将这些技术应用于测试用例本身。 很明显如何使用PostSharp来做到这一点 – 这是他们的第一个例子。 但是,我不想将他们的许可处理添加到我们的项目中,仅用于此实验。 我发现AOP for C#的所有其他参考都是基于IoC容器实现提供的(动态)拦截器,例如CastleWindsor,Unity,Spring.Net ……在这种情况下它们都有一个共同的问题:你需要一个一段安装代码,用于为要添加拦截器的对象创建代理。 (我原本认为这段代码也必须创建一个IoC容器,但我发现我错了。) 但我无法看到这个设置代码将用于nUnit测试用例的位置。 我提出的选项,以及他们的问题: 让testfixture类构造函数为自己创建一个代理。 由于递归(消费者要求事物,事物试图将代理返回到事物,代理尝试创建事物……从阅读此StackOverflow问题 )将无法工作 滚动我自己的reflection魔术(对我来说这将是一项艰巨的任务) 让构造函数包装testfixture类中的所有方法并返回这个’wrapped’对象(不确定这是否可能构造函数执行此操作) 在testfixture上使用静态构造函数来做这个魔术(假设您可以动态地将类的方法包装到位。) 使用模块cctor(通过Einar Egilsson的InjectModuleInitializer )在模块级别执行某些操作,并使用日志记录包装所有类中的所有方法。 最简单的:用于实例化测试用例的某种工厂(非测试参数),我可以使用其中一个IoC代理生成器 对于nUnit:我能找到的唯一方法是创建自定义AddIn 。 优势 – 可能不会破坏与ReSharper的集成。 缺点 – 部署到所有开发人员机器,尤其是对NUnit的更新。 是否还有其他方法可以为nUnit执行此操作? 对于MbUnit:看起来它将测试用例视为第一类值 ,这很简单。 优点:易于部署到所有开发人员。 缺点:测试不会出现在Resharper中。 旁注: 如何处理设置和拆卸 。 我的选项和结论中是否遗漏了任何内容? 有没有更简单的方法来做到这一点,我错过了?

如何使用Ninject设置可选方法拦截?

假设我有一个类,我希望有时*(但现在总是)拦截一些(但不是全部)方法。 我理解它的方式,可以使用我的Ninject模块中的InterceptAround() (在更高级别的代码中),或者使用这些方法上的InterceptAttribute派生属性(在实现级别)来完成。 我真的不喜欢这样做的第一种方式,因为它需要消费者知道细节,有很多类有很多方法。 但我也不喜欢第二种方式,因为我没有看到如何禁用(或者更确切地说,不启用)拦截,因为属性与代码融合。 有没有一些已知的方法来解决这个问题? *:在应用程序的生命周期内。

为什么编译后代码注入比预编译代码注入更好?

所以我们都知道C#没有类似C的宏预处理器(这里有一个很好的线程)。 但是现在AOP正在获得牵引力,似乎我们开始使用后处理器来处理我们曾经使用预处理器的事情(请记住,我只是在使用PostSharp,所以可能不在)。 我是C#中属性的忠实粉丝,但是如果一个预处理器被遗漏了很多理由(作为一个前MFC用户,我仍然质疑但仍然接受)为什么编译后代码注入比预先更好?编译代码注入?

有关C#的AOP建议

我有一个ASP.NET 3.5 SP1 Webforms应用程序。 我使用带有DI(autofac)的MVP模式(监督控制器)。 我的演示者调用我的域(DDD)中定义的存储库合同,这些合同在基础结构项目中实现。 演示者调用的存储库方法可以是hork,因此我需要记录exception,然后在View上设置错误消息。 在过去,我会在Presenter构造函数中添加另一个参数,将引用存储在Base Presenter中,并在Catch块中调用Log方法。 我真的不喜欢这个,但它完成了工作。 我可以使用工厂来获取此处所述的日志记录类,但我想首先探索AOP,因为它看起来非常有趣。 我已经完成了编译时与运行时AOP的阅读,我想知道人们对不同解决方案,优缺点,建议词等的经验。 从我所做的挖掘来看,似乎在.NET中有4个主要的AOP框架 温莎城堡 – 我一般都远离这个,因为它做了很多我真的不需要的东西 Spring.net – 听起来它有良好的记录,但通过其xml配置激发了恐惧(我不喜欢非流畅的配置) PostSharp – 属性驱动(我喜欢这个),但有一点有一些行号问题 ,不确定它们是否仍然存在 团结 – 我真的不需要很多东西 我看到另一个问题有一些好的答案,但是从一年半前开始。 是否有更新的,“更好”的框架在此期间开发,或者对现有解决方案的改进应该加以考虑? 作为参考,我选择了Autofac for DI,因为它流畅,易于使用,找不到任何关于它的负面评论,它只是有效。 是否有关于我应该尝试哪种AOP框架的建议? 感谢阅读所有这些并添加任何想法。

如何使用PostSharp实现延迟加载?

我想用PostSharp在属性上实现延迟加载。 简而言之,而不是写作 SomeType _field = null; private SomeType Field { get { if (_field == null) { _field = LongOperation(); } return _field; } } 我想写 [LazyLoadAspect] private object Field { get { return LongOperation(); } } 所以,我确定我需要在类中发出一些代码来生成支持字段,以及在getter方法中为了实现测试。 使用PostSharp,我正在考虑重写CompileTimeInitialize ,但我错过了处理已编译代码的知识。 编辑:问题可以扩展到任何无参数的方法,如: SomeType _lazyLoadedField = null; SomeType LazyLoadableMethod () { if(_lazyLoadedField ==null) { // Long operations […]

针对c#的开源面向方面库的建议

有关c#的开源面向方面库的任何建议。 谢谢

在Spring.Net中向一个递归方法注入建议?

我正在尝试使用Spring.NET对AOP的支持来进行控制/面向方面编程的dependency injection/反转(对于大量的流行语感到抱歉 – 也许我会发布一个单独的问题,要求某人澄清差异:)) 。 具体来说,我希望拦截一个递归方法调用,这样每次调用该方法时,都会调用AOP通知/拦截器。 Spring.Net似乎没有拦截除第一个方法调用之外的任何东西。 我认为 Spring.Net正在为每个实例维护1个截距链,并且在第一个方法调用完成之前不再调用任何拦截器。 有没有人有任何关于获取为每个方法调用触发的拦截器(建议)的信息,包括递归调用? 我可以提供代码/示例输出,如果这有用的话。 谢谢!