Dependency injection 注入身份验证信息

Dependency injection 注入身份验证信息,dependency-injection,guice,Dependency Injection,Guice,我有一个应用程序可以连接到多个站点,每个站点使用不同的用户名/密码对。我想做的是连接依赖项,这样我就可以说“无论何时需要FTPC连接,使用此连接”,“此连接”取决于用户想要什么 假设我有一个这样的类(伪GoogleGuice语法): 以及使用它的类 public class SomeFTPSiteProcessor { SomeFTPSiteProcessor(@Inject FTPConnection)... } 我想做的是,每当我需要某个ftpsiteProcessor实例时,就创

我有一个应用程序可以连接到多个站点,每个站点使用不同的用户名/密码对。我想做的是连接依赖项,这样我就可以说“无论何时需要FTPC连接,使用此连接”,“此连接”取决于用户想要什么

假设我有一个这样的类(伪GoogleGuice语法):

以及使用它的类

public class SomeFTPSiteProcessor
{
    SomeFTPSiteProcessor(@Inject FTPConnection)...
}
我想做的是,每当我需要某个ftpsiteProcessor实例时,就创建“当前活动”连接

我该怎么做?我会用示波器吗?我会使用提供商吗?帮助最好使用伪代码

我希望这有点道理

编辑:用户在运行时选择使用哪个FTP连接,因此我需要动态提供身份验证信息。这种语言让我想到了某种形式的提供者,但我不能完全理解它是如何实现的

谢谢

这就是问题所在

public class SomeFTPSiteProcessor
{
    SomeFTPSiteProcessor(@JeffsFtpServer FTPConnection)...
}

public class SomeOtherFTPSiteProcessor
{
    SomeFTPSiteProcessor(@FredsFtpServer FTPConnection)...
}

class FtpModule extends PrivateModule {
    String username;
    String password;
    Class<? extends Annotation> annotation;   

    void configure() {
         bind(String.class).annotatedWith(Username.class).with(username);
         bind(String.class).annotatedWith(Password.class).with(password);
         expose(FTPConnection.class).annotatedWith(annotation);
    }
}
Injector injector = Injector.createInjector(
    new FtpModule("fred", "password", FredsFtpServer.class), 
    new FtpModule("jeff", "password", JeffsFtpServer.class));

但这是编译时的事情。我需要它在运行时是可变的。与机器人腿的实例略有不同的是,将腿数(例如)看作是GUI用户传入的值。因此,用户名和密码在编译时是未知的,只有在注入器创建根对象之后的某个时间点才知道。那有意义吗?我想你需要一个工厂。可能是因为那家工厂有一个注射器的例子亲爱的上帝不。。。除此之外的任何事。一定有办法做到这一点。其他应用程序如何处理“当前用户”注入??我认为这很相似。在网络环境中?然后是会话作用域对象。是否每个项都存在于逻辑范围中?它不在web上下文中。这是一个桌面应用程序。我可能需要再考虑一下设计。
public class SomeFTPSiteProcessor
{
    SomeFTPSiteProcessor(@JeffsFtpServer FTPConnection)...
}

public class SomeOtherFTPSiteProcessor
{
    SomeFTPSiteProcessor(@FredsFtpServer FTPConnection)...
}

class FtpModule extends PrivateModule {
    String username;
    String password;
    Class<? extends Annotation> annotation;   

    void configure() {
         bind(String.class).annotatedWith(Username.class).with(username);
         bind(String.class).annotatedWith(Password.class).with(password);
         expose(FTPConnection.class).annotatedWith(annotation);
    }
}
Injector injector = Injector.createInjector(
    new FtpModule("fred", "password", FredsFtpServer.class), 
    new FtpModule("jeff", "password", JeffsFtpServer.class));
class ThingieFactory() {
     @Inject Injector injector;

     SomeFTPSiteProcessor create(params... ) {
          return injector.createChild(new Module() { set params; } ).get(SomeFTPSiteProcessor.class);
     }
}