Dependency injection 是不是;“坏习惯”;将参数传递给guice模块

Dependency injection 是不是;“坏习惯”;将参数传递给guice模块,dependency-injection,guice,Dependency Injection,Guice,看看Guice,我很喜欢。我目前有一个问题,guice通过注入我需要的所有必需依赖项来解决这个问题。但我想知道我是否用错了Guice。但我需要的是根据特定实例定义绑定。为了实现这一点,我在模块中传递了实例 例如,考虑下面的(与我的问题有点类似): 我使用此模块将帐户依赖项注入到需要特定客户帐户的报表生成器类中。例如,用户选择了一个特定的客户,并表示希望显示生成的报告。我有这样的方法 public void printReport (Customer customer){ Injector

看看Guice,我很喜欢。我目前有一个问题,guice通过注入我需要的所有必需依赖项来解决这个问题。但我想知道我是否用错了Guice。但我需要的是根据特定实例定义绑定。为了实现这一点,我在模块中传递了实例

例如,考虑下面的(与我的问题有点类似):

我使用此模块将帐户依赖项注入到需要特定客户帐户的报表生成器类中。例如,用户选择了一个特定的客户,并表示希望显示生成的报告。我有这样的方法

public void printReport (Customer customer){
   Injector injector = Guice.createInjector(new CustomerModule(customer));
   ReportGenerator reportGenerator  = injector.getInstance(ReportGenerator.class);

   showReport(reportGenerator.generate())
}
一旦工作完成,我就完成了这个模块

这是guice的正常使用吗?

接受模块的构造函数参数是合适的,也是有用的。在为类似对象进行绑定时,这是一种特别常见的模式。例如:

// Installs @Named("accounts") Db to the given impl, backed with the given cache.
install(new DbModule("accounts", AccountDb.class, InMemoryCache.class));
// Same as above.
install(new DbModule("users", UserDb.class, DiskCache.class));
install(new DbModule("products", ProductDb.class, CustomProductCache.class));
也就是说,每个操作(例如
printReport
)创建一个新的根注入器并不常见。注入器创建可能需要很长时间,因为Guice会反射式地查询类及其依赖项。相反,更常见的做法是在应用程序启动时创建根注入器,然后在需要以现有方式绑定特定对象时创建根注入器

尽管您可以暂时为每个操作创建一个全新的根注入器,但请记住,未来的开发可能会使单个操作或应用程序级别的范围超出单个操作的范围,或者,您的对象图可能会增长,以至于中间操作根注入器创建的性能不再足以满足您的使用。如果发生这种情况,您可能希望将大部分注入器创建和配置转移到可预测的启动流程中,并且只将您的客户(而不是其他客户)绑定到子注入器中。

接受模块的构造函数参数是适当且有用的。在为类似对象进行绑定时,这是一种特别常见的模式。例如:

// Installs @Named("accounts") Db to the given impl, backed with the given cache.
install(new DbModule("accounts", AccountDb.class, InMemoryCache.class));
// Same as above.
install(new DbModule("users", UserDb.class, DiskCache.class));
install(new DbModule("products", ProductDb.class, CustomProductCache.class));
也就是说,每个操作(例如
printReport
)创建一个新的根注入器并不常见。注入器创建可能需要很长时间,因为Guice会反射式地查询类及其依赖项。相反,更常见的做法是在应用程序启动时创建根注入器,然后在需要以现有方式绑定特定对象时创建根注入器

尽管您可以暂时为每个操作创建一个全新的根注入器,但请记住,未来的开发可能会使单个操作或应用程序级别的范围超出单个操作的范围,或者,您的对象图可能会增长,以至于中间操作根注入器创建的性能不再足以满足您的使用。如果发生这种情况,您可能希望将大多数注入器创建和配置转移到可预测的启动流程,并且只将您的客户(而不是其他客户)绑定到子注入器中