当主题类添加依赖项所需的参数时,我正在寻找解决依赖关系的模式。
我的专业课有:
private HTTPServer httpServer;
主题类具有向用户询问端口号的UI。设置后,将调用构造函数:
httpServer = new HTTPServer(Port);
httpServer.Start();
httpServer.HttpRequest += httpServer_HttpRequest;
解决此问题的最佳模式是什么?
答案 0 :(得分:0)
我看到两种可能性(并且个人更喜欢第一种)。这都是用伪代码编写的,但在大多数框架中应该是类似的东西。
从按钮操作调用方法userEnteredPort
和userWantsServerStart
:
class UI {
private HTTPServer httpServer;
@Inject
public UI(HTTPServer httpServer) {
this.httpServer = httpServer;
}
public void userEnteredPort(int port) {
httpServer.setPort(port);
}
public void userWantsServerStart() {
if (!httpServer.hasPort()) {
displayError("No port set");
return;
}
httpServer.start();
}
}
创建Provider类:
class HTTPServerCreator extends Provider<HTTPServer> { // or something similar
public HTTPServer create() {
MessageDialog md = new MessageDialog("Which port do you want to use?");
return new HTTPServer(md.getResult);
}
}
将您的提供者类映射到.class:
injector.setProvider(HTTPServer.class, HTTPServerCreator);
并使用您的用户界面:
class UI {
private HTTPServer httpServer;
@Inject
public UI(HTTPServer httpServer) {
this.httpServer = httpServer;
}
public void userWantsServerStart() {
// server already contains a valid port!
httpServer.start();
}
}
答案 1 :(得分:0)
我找到了一个解决方案 - 所以我觉得分享回来是一个好主意
对于目标类(即HttpServer),我制作了一个接口。然后,创建一个Factory类,使用带有port参数的CreateInstance。
public class HTTPServerFactory
{
public virtual IHTTPServer CreateInstance(int port)
{
return new HTTPServer(port);
}
};
然后,对于SUT(受测试对象)类,将其传递给HTTPServerFactory参数。 SUT可以使用自己的自定义UI /业务逻辑来获取要使用的端口。然后SUT在工厂调用CreateInstance,从而可以模拟HTTPServer。