c# - 带有请求/回复的消息/事件系统

标签 c# .net messaging

我正在尝试构建一个小型消息/事件系统,消息可能是请求。

请求处理程序实现了 IHandlerOf<T>界面如

public class UserService : IHandlerOf<ISearchRequest>
{
    private void ProccessRequest(ISearchRequest request)
    {
    }
}

我不确定我应该如何处理回复,因为多个处理程序可以“回答”一个请求。你将如何设计回复部分?在消息代理中构建一个回复列表,或者在 process 方法中包含回复对象并让所有处理程序处理同一个回复对象?

示例将不胜感激。

或者您是否有任何指向现有解决方案的链接?使用服务总线(如 nservicebus)似乎有点矫枉过正,因为一切都在进行中。

更新

我当前的解决方案(进行中)。代理通过检查 IHandlerOf<> 创建响应对象为在 BeginRequest 中使用的请求类型注册的接口(interface).

该解决方案的缺点是,没有任何东西将请求和回复联系在一起,如果将不正确的回复类型映射到请求类型,则不会产生编译错误。尽管如果请求有两种不同的响应类型,代理会在注册过程中抛出错误。

代理在每个处理程序调用周围使用 try/catch,以便能够继续处理请求处理程序,即使其中一个抛出异常。我还没有真正决定如何处理异常。一个处理程序可能会抛出异常,而另一个处理程序可能会成功处理请求。

处理程序接口(interface):

// interface defining a class which would handle a request
public interface IHandlerOf<TRequest, TResponse> 
    where TRequest : IRequest 
    where TResponse : IResponse
{
    void ProcessRequest(IRequestContext<TRequest, TResponse> context);
}

示例实现

public class FindContactsRequest : IRequest
{
    public string SearchValue { get; set; }
}

public class FindContactsResponse : IResponse
{
    public ICollection<string> Contacts { get; set; }
}

public class UserService : IHandlerOf<FindContactsRequest, FindContactsResponse>
{
    public void ProcessRequest(IRequestContext<FindContactsRequest, FindContactsResponse> context)
    {
        if (context.Request.SearchValue == "blabla")
        {
            context.Response.Contacts.Add("My contact name");
        }
    }
}

经纪人界面

public interface IMessageBroker
{
    IAsyncResult BeginRequest(IRequest request, AsyncCallback callback, object state);
    IResponse EndRequest<T>(IAsyncResult result) where T : IResponse;
}

示例用法

var ar = _broker.BeginRequest(new FindContactsRequest("blabla"));
var response = _broker.EndRequest<FindContactsResponse>(ar);
Console.WriteLine("Woho, found " + response.Contacts.Count + " contacts.");

最佳答案

如果所有处理程序都针对同一个回复对象工作,则回复对象需要某种逻辑来防止错误的处理程序破坏其他处理程序的回复。也就是说,如果回复对象包含 List<string> ,例如,一个行为不端的处理程序可以调用 Clear在名单上,一切都会丢失。因此,回复对象需要包装该列表(通过提供 AddReply 方法或类似方法)以防止此类行为。

此外,如果所有处理程序都针对同一个回复对象工作,那么多线程请求处理就会变得更加困难。回复对象必须处理线程同步以防止数据损坏。

另一方面,如果消息代理处理合并回复,则您会更加灵活。它可以依次(顺序)调用每个处理程序,也可以使用异步调用并行运行多个处理程序。消息代理似乎是放置组合回复逻辑的更容易和更灵活的地方。

关于c# - 带有请求/回复的消息/事件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5083101/

相关文章:

c# - 从 WPF 保存到 SQL Server 数据库

c# - 如何使定时器以重复的方式触发

c# - 如何将系统麦克风音频流传输到连接的设备麦克风音频流

java - 消耗掉所有 Kafka 主题然后立即断开连接?

c# - 在 C# 中包装 ObservableCollection<T>

c# - 在弹出窗口中使用 Owin 外部登录的 Asp.net 登录提供程序

c# - 向字符串类添加扩展方法 - C#

java - JMS 客户端确认模式下的保证交付如何工作?

c# - .Net 中的 JMS 等价物

c# - 对象引用未设置为 Razor 下拉列表中对象的实例