从抽象返回具体结果的软件模式



因此,我正试图找出如何(或者是否可能(将具有一些非常规需求的特定软件体系结构组合在一起。该体系结构有一个服务层和可能使用该服务层的多个客户端层。

我希望服务层接受一个抽象,并返回一个具有客户端层定义的具体实现的抽象,这样客户端就可以获得他们需要的任何特定结果,而服务层不知道所需的输出类型。

我可以使用泛型或标记接口和直接铸造结果来解决这个问题,但这两种方法都不适合我的目标,我希望这里的人能得到我所缺乏的灵感。

这是一个抽象整体结构的粗略例子,但如果合适的解决方案需要,可以进行修改:

interface IServiceResult {
// No idea what methods this should have yet
}
interface IServiceHandler {
IServiceResult CouldNotFindFile();
IServiceResult CouldNotReadFile();
IServiceResult ServiceSuccessful();
}
interface IService {
IServiceResult PerformService(IServiceHandler outcomes);
}
// Console Client Code:
IService service = new Service();
IServiceHandler handler = new ConsoleServiceHandler();
IServiceResult result = service.PerformService(handler);
/* Some process to convert IServiceResult to text to display in the console */
// API Endpoint Client Code:
IService service = new Service();
IServiceHandler handler = new ApiServiceHandler();
IServiceResult result = service.PerformService(handler);
/* Some process to convert IServiceResult to Http Status Code to return to client */

我的直觉是对IServiceResult进行某种双重调度,但从那时起,我无法想出/如何得出所需的结果。任何见解都将不胜感激。

您尝试做的事情的问题是resulthandler的具体类型需要对应,而在语言的类型系统中没有表达这种约束的方法。如果您尝试使用双重调度,您最终会得到一个为每个具体类型都有方法的接口,而这是一个很难维护的问题。

最好使用一个一开始就不需要约束的设计。

您可以通过完全取消IServiceResult来简化界面并避免此问题

interface IServiceResponder {
void CouldNotFindFile();
void CouldNotReadFile();
void ServiceSuccessful();
}
interface IService {
void PerformService(IServiceResponder responseTarget);
}
// Console Client Code:
IService service = new Service();
// this will print the response to the console when it is set
IServiceResponder responder = new ConsoleServiceResponder();
service.PerformService(responder);

最新更新