【发布时间】:2019-07-15 23:27:25
【问题描述】:
我想要一些关于如何通过依赖注入构造一些对象的建议。
我的大部分应用程序都是单例,将单例作为相互依赖注入非常简单。
但是,我有一种情况,我会动态生成一些依赖于多个单例的瞬态对象。
这是当前情况的一些 C# 伪代码:
// random singletons
public static class SingletonA {...}
public static class SingletonB {...}
public static class SingletonC {...}
// random objects that all need to depend on some subset of the above singletons
public class BaseTask {...}
public class TaskA : BaseTask {...}
public class TaskB : BaseTask {...}
public class TaskC : BaseTask {...}
public class Scheduler {
public Scheduler() {
}
public void Start() {
// When these tasks are created is actually really dependent on business logic,
// and each task executes a bunch of internal logic.
// Each Task can create more children Task at arbitrary times too.
...
var taskA = new TaskA();
...
var taskB = new TaskB();
...
var taskC = new TaskC();
...
}
TaskA, TaskB, TaskC, ... 中都有调用单例方法的代码。此外,每个任务都可以构建新任务。
如果我使用依赖注入,我可以这样做:
public class Scheduler {
private ISingletonA _singletonA;
private ISingletonB _singletonB;
...
public Scheduler(ISingletonA singletonA, ISingletonB singletonB, ...) {
_singletonA = singletonA;
_singletonB = singletonB;
...
}
public void Start() {
...
var taskA = new TaskA(_singletonA, _singletonB, ...);
...
var taskB = new TaskB(_singletonA, _singletonB, ...);
...
var taskC = new TaskC(_singletonA, _singletonB, ...);
...
}
}
这看起来很乱,所以我正在考虑将所有 TaskA、TaskB、TaskC 重构为一个通用类并制作类似工厂的东西:
public class Scheduler {
public TaskFactory _taskFactory
public Scheduler(TaskFactory taskFactory) {
_taskFactory = taskFactory;
}
public void Start() {
...
var taskA = _taskFactory.NewTaskA(_taskFactory);
...
var taskB = _taskFactory.NewTaskB(_taskFactory);
...
var taskC = _taskFactory.NewTaskC(_taskFactory);
...
}
}
有更好的想法吗?如果不是,我认为这不是工厂模式。有更准确的名称吗?
【问题讨论】:
-
您将单例显示为静态类。这是故意的吗?
-
是的,使用工厂模式是处理瞬态对象需要注入依赖项的情况的第一个也是最明显的选项。工厂负责实例化和填充构造函数参数,只需将自己注入的依赖项复制到构造函数参数中即可。只要确保给工厂一个接口,以便单元测试可以存根它。
-
@Nkosi 它们目前是静态类。当我引入依赖注入时,它们不会是静态类。
-
@JohnWu 我认为工厂通常有一个创建方法来创建各种对象。就我而言,我的工厂接口将有 3 次以上的创建(基本上将所有构造函数整理到一个类中)。那仍然被认为是“工厂”吗?不幸的是,我还需要将工厂作为依赖项传递给每个
Task类。 -
@JohnWu 我说的是语义上的
Factory。
标签: c# unit-testing design-patterns factory factory-pattern