对每个方法的返回值执行操作

时间:2010-05-21 16:47:33

标签: c#

我想做的是使用类中每个方法返回的值进行一些操作。

例如,如果我有一个具有方法的类Order

public Customer GetCustomer()
{
 Customer CustomerInstance = // get customer
 return CustomerInstance;
}

假设我想记录这些的创建 - Log(CustomerInstance);

我的选择(AFAIK)是:

  1. 在返回对象之前,在每个方法中调用Log()。我不喜欢这个,因为如果在许多方法上使用很多方法,它会变得笨拙。它也不是该方法目的的固有部分。

  2. 使用组合或继承将Order类的日志调用分层,类似于:

    public Customer GetCustomer()
    {
     Customer CustomerInstance = this.originalCustomer.GetCustomer();  日志(CustomerInstance);
     返回CustomerInstance;
     }
    我认为这不会给我带来超过#1的任何东西。

  3. 为每个返回的类型创建扩展方法:

    Customer CustomerInstance = Order.GetCustomer()。Log();
    这有很多缺点。

  4. 我希望尽可能自动地为每个(或几乎每个)返回的对象执行此操作,而无需编写双倍的代码量。我觉得我要么试图将语言弯曲成不应该做的事情,要么就是没有认识到能够实现这一目标的语言特征。非常感谢可能的解决方案。

3 个答案:

答案 0 :(得分:1)

您需要查看Aspect Oriented Programming

  

通常,一个方面分散或纠缠为代码,使其更难理解和维护。由于函数(例如日志记录)分散在可能使用其功能的许多不相关的函数中,可能在完全不相关的系统,不同的源语言等中分散。这意味着更改日志记录可能需要修改所有受影响的模块。各方面不仅与表达它们的系统的主线功能纠缠在一起,而且彼此之间也会纠缠在一起。这意味着改变一个问题需要理解所有纠结的问题,或者有一些方法可以推断出变化的影响。

添加日志记录是此方法的一种用途。

答案 1 :(得分:0)

您应该查看Microsofts Enterprise Library

认为您可能会发现Policy Injection Application Block有用。

答案 2 :(得分:0)

在我看来,您的选择1是实现目标的方式。即使这将在每个方法的最后,这就是所做的。我不会添加额外的模糊层,因为它不是方法的“内在目的”。

顺便说一句,面向方面的编程正好解决了你所遇到的这个问题(参见ChrisF的回答),但后来我们不再谈论C#了。