【发布时间】:2016-11-03 13:33:07
【问题描述】:
我有一个记录服务输入/输出的旧版应用程序。目前,每个方法都有相同的行来记录请求和响应对象。我想使用 AOP,但不添加任何额外的工具(Postsharp、Castle 等),或者将每个服务类包装到另一个类(ServiceWrapper)中。
为了做到这一点,我正在尝试创建一个知道它应该记录请求和响应对象的通用类。这是我正在尝试的:
using System;
namespace ProxyTest
{
class Program
{
static void Main(string[] args)
{
var request = "request";
var fooService = new FooService();
ServiceProxy.Invoke(r => fooService.DoFoo(request), "abc");
Console.Read();
}
}
class ServiceProxy
{
public static void Invoke(Func<object, object> service, object request)
{
Console.WriteLine("input:" + request);
var response = service(request);
Console.WriteLine("output:" + response);
}
}
class FooService
{
public string DoFoo(object a)
{
return a + ": returning: Do Foo";
}
}
}
虽然它可以工作,但“abc”字符串只是用于编译应用程序,而不是用作请求参数。如果我删除它,代码将无法编译。我错过了什么吗?
更新
改成以下就行了:
static void Main(string[] args)
{
var request = "request";
var fooService = new FooService();
ServiceProxy.Invoke(r => fooService.DoFoo(r), request);
Console.Read();
}
【问题讨论】:
-
您可以访问服务源吗?是 WCF 服务吗?
-
“但它没有被用作请求参数” - 目前在 ServiceProxy.Invoke 中。我不清楚你在这里问什么......
-
为什么不这样称呼它
ServiceProxy.Invoke(r => fooService.DoFoo(r), request);或者只是ServiceProxy.Invoke(fooService.DoFoo, request); -
ServiceProxy.Invoke(r => fooService.DoFoo(request), "abc");fooService.DoFoo()是否返回Func<object, object>()?你的意思可能是:ServiceProxy.Invoke(r => fooService.DoFoo, request);(DoFoo without the parameter) -
如果您的方法是通用的并且实际上返回了响应
public static TResponse Invoke<TRequest, TResponse>(Func<TRequest, TResponse> service, TRequest request),这似乎更有意义。那么你的DoFoo可以使用string而不是object。
标签: c# design-patterns delegates aop func