1

我正在使用 Agatha 请求/响应库(以及 Agatha 1.0.5.0 使用的 StructureMap)作为我正在原型设计的服务层,我注意到的一件事是需要创建大量的处理程序. 任何请求/响应类型对都需要自己的处理程序通常是有意义的。但是,随着这扩展到将有很多处理程序的大型企业环境。

我开始做的是将企业域划分为逻辑处理器类(数十个处理器,而不是数百甚至可能最终数千个处理程序)。约定是每个请求/响应类型(所有这些都继承自域基础请求/响应对,继承自 Agatha 的)在某处的处理器中恰好获得一个功能。

通用处理程序(继承自 Agatha 的 RequestHandler)然后使用 Handle 方法中的反射来查找给定 TREQUEST/TRESPONSE 的方法并调用它。如果它找不到一个或找到多个,它会返回一个包含错误消息的 TRESPONSE(消息在域的基本响应类中标准化)。

这里的目标是让整个企业的开发人员只关心在域中编写他们的请求/响应类型和处理器函数,而不必花费额外的开销来创建处理程序类,这些处理程序类都做同样的事情(将控制权传递给处理器功能)。

但是,似乎我仍然需要为每个请求/响应类型对定义一个处理程序类(尽管是空的,因为基本处理程序会处理所有事情)。否则,在向服务分派请求时会引发以下异常:

StructureMap 异常代码:202 没有为 PluginFamily Agatha.ServiceLayer.IRequestHandler`1 定义默认实例 [[TSFG.Domain.DTO.Actions.HelloWorldRequest, TSFG.Domain.DTO, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] ],Agatha.ServiceLayer,版本=1.0.5.0,文化=中性,PublicKeyToken=6f21cf452a4ffa13

有没有一种我没有看到告诉 StructureMap 和/或 Agatha 始终对所有请求/响应类型对使用基本处理程序类的方法?或者也许使用 Reflection.Emit 在应用程序启动时在内存中生成空处理程序只是为了满足要求?

我对这些库并不是 100% 熟悉,并且正在学习,但到目前为止,我对这两种可能的方法的尝试都没有成功。任何人都可以提供一些解决这个问题的建议,或者完全提供另一种方法吗?

4

1 回答 1

2

我对阿加莎不熟悉。IRequestHandler<T>但是,如果您希望通过 满足所有请求BaseHandler<T>,则可以使用以下 StructureMap 注册:

For(typeof(IRequestHandler<>)).Use(typeof(BaseHandler<>));

当某事要求 a 时IRequestHandler<Foo>,它应该得到 a BaseHandler<Foo>

于 2010-04-29T02:52:21.513 回答