gpt4 book ai didi

c# - 注册来自不同类的回调

转载 作者:行者123 更新时间:2023-11-30 16:04:14 24 4
gpt4 key购买 nike

对于标准请求服务器,我使用以下代码将请求与服务匹配并处理传入请求。

服务提供商

public class ServiceProvider
{
public ServiceProvider()
{
Services = new Dictionary<Type, IService>
{
{ typeof(FooRequest), new FooService() },
{ typeof(BarRequest), new BarService() },
};
}

protected void OnRequestReceived(object request)
{
Services[request.GetType()].Process(request);
}
}

FooService

public class FooService : IService
{
public object Process(object request)
{
// Process request
}
}

这很有用,但我想摆脱每个服务的一个方法(进程)。我尝试使用 Actions 和 Delegates,但我无法以某种方式完成这个简单的结构。

基本上我的问题是:如何从另一个类注册多个方法/回调并将它们存储在字典中以备我需要时调用它们?

期望的结果(伪代码):

服务提供商

public class ServiceProvider
{
public ServiceProvider()
{
var fooService = new FooService();
var barService = new BarService();

Handlers = new Dictionary<Type, Action>
{
{ typeof(FooRequestA), fooService.ProcessA },
{ typeof(FooRequestB), fooService.ProcessB },
{ typeof(BarRequest), barService.Process },
};
}

protected void ProcessRequest(object request)
{
Handlers[request.GetType()].Invoke(request);
}
}

FooService

public class FooService
{
public object ProcessA(FooRequestA request)
{
// Process request A
}

public object ProcessB(FooRequestB request)
{
// Process request B
}
}

解决方案的改进

使用以下方法可以简化重复请求服务匹配代码:

public void RegisterHandler<TRequest>(Action<TRequest> function)
{
Handlers.Add(typeof(TRequest), request => function.Invoke((TRequest) request));
}

这导致非常干净的用法:

RegisterHandler<FooRequestA>(request => fooService.ProcessA(request));

最佳答案

这是我能想到的最好的。 (在努力接近您的要求时……可能有更好的方法来实现您真正想做的事情)。我认为您使用该解决方案会失去一点类型安全性:

FooService

public class FooService
{
public object ProcessA(FooRequestA request)
{
return null;
}
public object ProcessB(FooRequestB request)
{
return null;
}
}

酒吧服务

public class BarService
{
public void Process(BarRequest request)
{ }
}

服务提供商

public class ServiceProvider
{
private readonly Dictionary<Type, Action<object>> Handlers;
public ServiceProvider()
{
var fooService = new FooService();
var barService = new BarService();

Handlers = new Dictionary<Type, Action<object>>
{
{typeof(FooRequestA), request => fooService.ProcessA((FooRequestA)request)},
{typeof(FooRequestB), request => fooService.ProcessB((FooRequestB)request)},
{typeof(BarRequest), request => barService.Process((BarRequest)request)}
};
}

protected void ProcessRequest(object request)
{
Handlers[request.GetType()].Invoke(request);
}
}

因为您无法将方法组(如 fooService.ProcessA)转换为 Action ,您需要将 lambda 添加到您的 Dictionary<Type, Action<object>>并将请求作为参数提供。

关于c# - 注册来自不同类的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35380232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com