Dao,遗留代码中的服务层
Dao, Service layer in legacy code
这个问题是关于业务层的设计。在遗留代码中实例化 Dao 或 Service class 的最佳方法是什么。
在需要 Dao 或 Service 的每个 class 中都是新的,恕我直言,这是一种糟糕的方法。
他们应该是无国籍的,单身人士。当然,我无法使用 Spring、CDI、EJB 或其他 DI 框架。
我的想法是这样的:
- 工厂方法(单例)
- 枚举单音
- 静态方法(恕我直言,错误的方法)
还有其他想法吗?
如果它是无状态的,将其设置为单例或每次需要一个实例时都创建一个新实例不会产生任何显着差异。使用这 3 种方法中的任何一种都会使对代码进行单元测试变得更加困难。
如果 DI 完全不可能,您可以使用穷人的依赖注入至少使您的代码可测试:
public class SomeService {
private SomeDao someDao;
/**
* Constructor used in production. Creates or looks up its own DAO
*/
public SomeService() {
this.someDao = new SomeDao();
}
/**
* Constructor used by unit tests, which can pass a mock DAO instance.
*/
public SomeService(SomeDao someDao) {
this.someDao = someDao;
}
...
}
这个问题是关于业务层的设计。在遗留代码中实例化 Dao 或 Service class 的最佳方法是什么。 在需要 Dao 或 Service 的每个 class 中都是新的,恕我直言,这是一种糟糕的方法。 他们应该是无国籍的,单身人士。当然,我无法使用 Spring、CDI、EJB 或其他 DI 框架。 我的想法是这样的:
- 工厂方法(单例)
- 枚举单音
- 静态方法(恕我直言,错误的方法)
还有其他想法吗?
如果它是无状态的,将其设置为单例或每次需要一个实例时都创建一个新实例不会产生任何显着差异。使用这 3 种方法中的任何一种都会使对代码进行单元测试变得更加困难。
如果 DI 完全不可能,您可以使用穷人的依赖注入至少使您的代码可测试:
public class SomeService {
private SomeDao someDao;
/**
* Constructor used in production. Creates or looks up its own DAO
*/
public SomeService() {
this.someDao = new SomeDao();
}
/**
* Constructor used by unit tests, which can pass a mock DAO instance.
*/
public SomeService(SomeDao someDao) {
this.someDao = someDao;
}
...
}