问题描述
因此,我正在尝试找出如何(或什至有可能)将具有某些非常规要求的特定软件体系结构组合在一起。该体系结构具有服务层以及可能使用该服务层的多个客户端层。
我想让服务层接受一个抽象,并以客户机层定义的具体实现返回一个抽象,使得客户机可以在服务层不了解的情况下获得所需的任何特定结果。所需的输出类型。
我可以使用泛型或标记接口和直接转换结果来解决此问题,但是这两者对于我的目标而言都不是最理想的,我希望这里的人会缺少我的灵感。
这是正在运行的抽象的总体结构的粗略示例,但是如果有合适的解决方案需要,则可以进行修订:
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
进行某种双重调度,但是从那时起,我无法解决/如何最终获得所需的结果。任何见解将不胜感激。
解决方法
您要执行的操作的问题是result
和handler
的具体类型需要对应,并且语言的类型系统中没有一种表达这种约束的方法。如果您尝试使用双重调度,那么最终会得到一个接口,该接口具有每种具体类型的方法,并且很难维护。
首先使用不需要该约束的设计会更好。
您可以完全放弃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);