在DDD中为每个服务类设置一个接口是一个很好的设计实践吗?

jan*_*y02 5 c# asp.net-mvc domain-driven-design dependency-injection inversion-of-control

我刚开始用DDD设计(我既没有老师也没有经验)

我有一些域服务类,必须在某些时候互相引用.所以我决定通过构造函数注入引用.

当我创建一个有很多数据要显示在控制器中的视图时,我必须创建一堆服务(其中一些引用彼此)

此时我的控制器的第一行看起来像这样:

        EmployeeRepository employRepository = new EmployeeRepository();
        ShiftModelRepository shiftModelRepository = new ShiftModelRepository();
        ShiftModelService shiftModelService = new ShiftModelService(shiftModelRepository);
        EmployeeService employeeService = new EmployeeService(employRepository, shiftModelService);
        OvertimeRepository overtimeRepository = new OvertimeRepository();
        OvertimeService overtimeService = new OvertimeService(overtimeRepository, employeeService);
Run Code Online (Sandbox Code Playgroud)

但我开始为服务创建接口并使用IoC控制器(名为StructureMap)

现在,同一控制器的第一行看起来像这样:

        IShiftModelService shiftModelService = ObjectFactory.GetInstance<IShiftModelService>();
        IOvertimeService overtimeService = ObjectFactory.GetInstance<IOvertimeService>();
        IEmployeeService employeeService = ObjectFactory.GetInstance<IEmployeeService>();
Run Code Online (Sandbox Code Playgroud)

我认为使用它会好得多,但我知道它是否是DDD中的一个好习惯.

Mat*_*ton 2

使用接口几乎总是更好的做法,也是良好的做法 - 所以第二个示例中的内容更好。

但正如 StuartLC 提到的,您确实想考虑将这些依赖项作为构造函数参数注入。

ObjectFactory.GetInstance 实际上是一种服务定位器,通常不是最佳使用模式,因为对象没有声明它具有哪些依赖项。通常最好将依赖项公开为构造函数参数并将它们注入。