为Agatha创建单一的通用处理程序?

时间:2010-04-28 18:48:50

标签: service structuremap layer agatha-rrsl

我正在使用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 ,Version = 1.0.5.0,Culture = neutral,PublicKeyToken = 6f21cf452a4ffa13

我是否有办法告诉StructureMap和/或Agatha始终对所有请求/响应类型对使用基本处理程序类?或者也许在应用程序启动时使用Reflection.Emit在内存中生成空处理程序以满足要求?

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

1 个答案:

答案 0 :(得分:2)

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

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

如果有人要求IRequestHandler<Foo>,则应该获得BaseHandler<Foo>