gpt4 book ai didi

transactions - 迁移应用程序以使用 Guice - 如何将事务注入(inject)现有对象?

转载 作者:行者123 更新时间:2023-12-04 08:01:14 24 4
gpt4 key购买 nike

我是 Guice 的新手,我正在将它用于具有大量遗留代码的应用程序。它有几个类,如下所示:

public final class DataAccessClass {

private Transaction txn;

@Inject //This was just added
public DataAccessClass(/* injectable parameters */, Transaction txn) {

this.txn = txn;
}

//Maybe add @Inject here to set a new transaction when it changes?
public void setTransaction(Transaction txn) {

this.txn = txn;
}

public void writeData(/* parameters for data to be written */) {

//Write data using the current instance of 'txn'
}
}

很清楚如何使用 Guice 绑定(bind)永不改变的实例,但是改变的实例(即事务)呢?有没有办法让我在更改时使用 Guice 注入(inject)不同的 Transaction 实例?请注意,事务实例不是受良好支持的 JPA/Hibernate/Spring 事务之一

我能想到的侵入性最小的方法(避免一次迁移每个使用事务的类)将仅在实例化对象时使用 Guice 注入(inject)事务,并且我会保留在必要时更新事务的现有应用程序代码.例如,此 Provider 可用于使用当前 Transaction 实例注入(inject)新对象:
public final class TransactionProvider implements Provider<Transaction> {

/** Nullable transaction that should be used for all operations at the moment */
private Transaction txn;

public TransactionProvider(Transaction txn) {

this.txn = txn;
}

/**
* @param txn Nullable transaction to use for all operations at the moment
*/
public void setTransaction(Transaction txn) {

this.txn = txn;
}

/* Provider methods */

public Transaction get() {

return this.txn;
}
}

应用程序逻辑看起来像这样:
public final class Application {

private final Provider<Transaction> transactionProvider;
private final DataAccessClass dao; //Instance provided by Guice

public void scopedOperation() {

//Use a fresh transaction for this operation
final Transaction txn = ...;

//Make transaction available to Guice (for new objects) and to legacy (already-instantiated) DAO classes
this.transactionProvider.setTransaction(txn);
this.dao.setTransaction(txn); //Legacy approach - can this be updated?

//Do some kind of data operation under the scope of the current transaction
try {
this.dao.writeData(...);
} catch (Exception e) {
txn.abort();
throw new RuntimeException("Operation failed", e);
}

//The operation is over now
this.txn.commit();
}

是否有其他方法可以更新现有类使用的 Transaction 实例,而无需一次迁移每个类?

最佳答案

如果我理解正确,您的问题有两个独立的部分:

  • 在 Guice-fied 类上使用正确的 Transaction 实例
  • 在遗留类上使用正确的 Transaction 实例。

  • 对于“1”,您的自定义提供程序有效,但我将为事务创建自定义范围并在该范围内绑定(bind) Transaction 类。见 http://code.google.com/p/google-guice/wiki/CustomScopes有关自定义范围的说明。

    关于'2',一旦你有一个自定义范围,这是使用 Guice 为遗留类提供实例的常见问题。您没有提到当前为遗留类提供 Transaction 实例的代码,但您可以更改该特定代码以从 Guice 请求实例。由于您在“事务范围”内,Guice 负责提供正确的实例。

    关于transactions - 迁移应用程序以使用 Guice - 如何将事务注入(inject)现有对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951831/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com