使用依赖注入时,初始化逻辑应该放在哪里

时间:2017-06-06 22:27:29

标签: java dependency-injection guice api-design

我正在编写一个Java包来与发电机表交互,我正在使用Guice进行DI。该软件包将客户端公开给其用户,如下所示 -

// External client
public class Client {
    DataManager manager;

    public static Client getClient() {
        return Guice.createInjector(new MyModule()).getInstance(Client.class);
    }
}

// Manager class to interact with dynamo
public class DataManager {
    AmazonDynamoDb amazonDynamoDb;
    DynamoDbMapper dynamoDbMapper;

    @Time // IMPORTANT - This is AOP style metric recording which records the amount of time taken to do a particular operation
    public void addRecord();
    public void deleteRecord();
    ...
}

// Class that represents an entry in the table
public class Data {
}

其中一个用例是在将客户端实例返回给此包的用户之前必须执行表检查。这基本上意味着我必须在我的代码中的某处调用initializeTable()函数。我的问题是我应该把这个逻辑放在哪里?

  • 在构造函数中?可能不是因为违反了仅在构造函数中进行布线的DI原则,并且使测试变得困难。
  • 在Guice模块中?我可以创建一个初始化客户端的@Provides函数,在返回它之前,运行init()函数。但是这里的一个限制因素是,如果对象实例不是由Guice本身创建的,那么我的AOP样式注释是行不通的。

我最终做的是这个(在模块本身上执行注入,将在客户端#getClient()方法中向Guice注册) -

public class InitializingModule extends AbstractModule {

/**
 * Perform injection on this instance so that the table initialization happens before any usable class is
 * returned to the clients of this package.
 */
@Override
protected void configure() {
    requestInjection(this);
}

/**
 * Configure dynamoDB to check for and initialize the table.
 *
 * @param startupUtil
 * @throws Exception
 */
@Inject
void configureDynamo(DynamoStartupUtil startupUtil) throws Exception {
    startupUtil.initialize();
}
}

那么这个初始化逻辑应该去哪里,以免DI的原则被违反,类很容易测试?请注意,Guice尚不支持@PostConstruct。

0 个答案:

没有答案