IoC依赖注入 - 当主题类将参数添加到依赖项时

时间:2014-06-23 11:29:17

标签: inversion-of-control

当主题类添加依赖项所需的参数时,我正在寻找解决依赖关系的模式。

我的专业课有:

private HTTPServer httpServer;

主题类具有向用户询问端口号的UI。设置后,将调用构造函数:

httpServer = new HTTPServer(Port);
httpServer.Start();
httpServer.HttpRequest += httpServer_HttpRequest;

解决此问题的最佳模式是什么?

2 个答案:

答案 0 :(得分:0)

我看到两种可能性(并且个人更喜欢第一种)。这都是用伪代码编写的,但在大多数框架中应该是类似的东西。

  • 创建一个空的HTTPServer对象并在流程中填写

从按钮操作调用方法userEnteredPortuserWantsServerStart

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();
    }
}
  • 将请求GUI部分的端口移动到httpServer创建者

创建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。