因此,我正在编写一个Web服务体系结构,其中包括执行请求的实际处理的FunctionProvider
类,以及一个主要的Endpoint
类,该类接收请求并将请求委托给适当的FunctionProvider
。
我不完全知道运行时可用的FunctionProvider
,因此我需要能够在我的主Endpoint
类中“注册”(如果这是正确的词),并查询它们是否匹配传入请求。
public class MyFunc implements FunctionProvider{
static {
MyEndpoint.register(MyFunc);
}
public Boolean matchesRequest(Request req){...}
public void processRequest(Request req){...}
}
public class MyEndpoint{
private static ArrayList<FunctionProvider> functions = new ArrayList<FunctionProvider>();
public void register(Class clz){
functions.add(clz);
}
public void doPost(Request request){
//find the FunctionProvider in functions
//matching the request
}
}
我确实没有像这样做过很多反射性的Java(上面的代码可能是错误的,但希望能证明我的意图)。
什么是最好的方式来实现这一目标而又不会被黑客入侵?
最佳答案
不要让FunctionProviders自注册。通过某个应用程序init引导端点。使用FunctionProviders列表进行调用。这样,您可以配置优先级(如果两个提供商都声称他们可以处理请求,该怎么办?)。现在设置方式,您需要以某种方式调用该类以触发静态构造函数,而这又是间接的。
如果检测FunctionProvider是否支持给定请求很简单,请考虑使其成为配置的一部分。如果在请求中,则将其映射到该FunctionProvider。这将使关注点分离开一些。如果检测很复杂,请考虑从FunctionProvider的单独类中进行检测。
通过配置委托/函数指针,可以完全避免使用FunctionProvider(不确定Java是否/如何支持委托)。