DI容器,工厂或新的短暂物体?

Kal*_*son 9 factory dependency-injection new-operator

处理需要在运行时只知道数据的对象时,例如用户名和密码,应该在哪里进行对象实例化:使用new,在工厂或在DI容器中?

例如,new一旦有了数据,我就可以只是一个对象:

UserCredentials creds =
    new UserCredentials(dialog.getUsername(), dialog.getPassword());
Run Code Online (Sandbox Code Playgroud)

或者,我可以使用工厂:

UserCredentials creds =
    CredentialsFactory.create(dialog.getUsername(), dialog.getPassword());
Run Code Online (Sandbox Code Playgroud)

或者,我可以在DI容器中使用提供程序(在这种情况下,它基本上是一个参数驱动的工厂).[省略示例代码.]

将DI容器用于如此简单的事情似乎都是错误的,但如果不充分利用它也似乎是错误的.

Mar*_*ann 8

一如既往,这取决于,但作为一般规则,像你的第二个选项的静态工厂只是一个很好的主意.

new使用UserCredential对象似乎是一个公平的选择,因为UserCredentials类看起来像一个自包含的具体类,可以使用用户名和密码中的所有不变量进行完全实例化.

在其他情况下,您要创建的类型本身可能代表抽象.如果是这种情况,则不能使用new关键字,而必须使用抽象工厂.

使用抽象工厂通常非常有价值,因为它允许您从运行时值和其他依赖项的组合中组合实例.有关更多信息,请参见此处

使用抽象工厂也有助于单元测试,因为您可以简单地测试返回值或结束状态或您关心的任何内容与抽象工厂的输出相关 - 您可以轻松地提供测试双,因为它是...抽象