5

我刚刚开始使用 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);

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

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

        IShiftModelService shiftModelService = ObjectFactory.GetInstance<IShiftModelService>();
        IOvertimeService overtimeService = ObjectFactory.GetInstance<IOvertimeService>();
        IEmployeeService employeeService = ObjectFactory.GetInstance<IEmployeeService>();

我认为它使用起来要好得多,但我知道这在 DDD 中是否是一个好的做法。

4

2 回答 2

2

使用接口几乎总是更可取和良好的做法 - 所以你在第二个例子中拥有的更好。

但正如 StuartLC 所提到的,您真的希望将这些依赖项作为构造函数参数注入。

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

于 2013-10-18T15:06:11.050 回答
2

是的,当您使用 DI(依赖注入)框架时,可以为每个实现使用一个接口。

您应该避免ObjectFactory.GetInstance<IShiftModelService>()并让您的框架使用YourImplementationOfControllerFactory.

我没有在我的项目中使用 Structure Map ,但我一直在使用Castle Windsor,这是另一个依赖注入框架。你也可以看看Ninject

无论如何,许多框架都有类似的步骤:

  1. 编写控制器工厂的自定义实现 - 一个继承DefaultControllerFactory.
  2. 注册容器应该解析的类型。
  3. 中的引导容器Global.asax.cs
  4. Global.asax.cs.

全球.asax.cs:

public class MvcApplication : System.Web.HttpApplication
{    
    protected void Application_Start()
    {
        /* code that bootstraps your container */

        //Set the controller builder to use our custom controller factory
        var controllerFactory = new YourControllerFactory();
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);
    }
}

有几个有用的链接:

于 2013-10-18T20:13:56.870 回答