2012-02-28 52 views
0

我们将Mongo Db用作数据库。将多个数据库(而不是一个)添加到现有应用程序

如果我们得到以下JAX-RS服务(或其他无状态/有状态的EJB)。

@Path("my_service_path") 
@Stateless 
public class GetSomeObject{ 

    @Inject 
    public DB database; 

    @GET 
    @Consumes("application/json") 
    @Produces("application/json") 
    public SomeDomainObject get(@QueryParam("some_param") String param){ 
    ... 
    database.find(...); 
    ... 
    return something; 
    } 
} 

问题:我们需要使用两个以上的数据库,但在我们的电流源,它似乎是不可能的。我们目前正在使用注入的数据库,但如果我们使用EntityManager实现或其他的东西,我们会遇到同样的问题。是否有一些集成的解决方案用于注入不同类的实例,具体取决于用户/应用程序。我们可以尝试

@Inject 
    public Map<String, DB> databases; 

但是我们必须添加太多的条件逻辑来处理这些数据库映射。

回答

1

在DI框架中执行此操作的典型方法是通过限定符。如果您使用CDI,那么您可以通过生产者和限定符注释的组合来完成此操作。我发现这是一个很好的方法,用于选择编译时已知的几个实例。如果您需要根据运行时信息检索实例,则可能需要使用Factory。

对于CDI,这里是一些伪代码:

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface PrimaryDatabase { 
} 

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface SecondaryDatabase { 
} 

public class DatabaseProducer { 

    @Produces 
    @PrimaryDatabase 
    public DB getPrimaryDB() { 
     // ... 
    } 

    @Produces 
    @SecondaryDatabase 
    public DB getSecondayDB() { 
     // ... 
    } 
} 

public class GetSomeObject{ 

    @Inject 
    @PrimaryDatabase 
    public DB primaryDB; 

    @Inject 
    @SecondaryDatabase 
    public DB secondaryDB; 
} 
相关问题