5

我刚开始设计DDD(我没有经验,没有一位老师)为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的一个好习惯。

+3

的接口都不错,但你应该看看人所以看看注射(特别是[构造函数注入](http://stackoverflow.com/questions/2531612/structuremap-resolve-dependency-through-injection-instead-of-service-location))而不是使用服务位置。 – StuartLC

+0

请阅读我对Matt Whetton的回答 – jannagy02

回答

2

使用接口几乎总是最好和良好做法 - 所以你必须在第二个例子是更好的。

但作为StuartLC提到,你真的想看看注入这些依赖构造函数的参数。

ObjectFactory.GetInstance真是一种服务定位的是一般不使用的对象不申报哪些依赖它具有最佳的模式。通常将依赖关系作为构造函数参数公开并更好地注入。

+0

我不确定我是否理解你的意思。 (我通过构造函数完成所有注入,并且StructureMap找到这些依赖关系)请在其他世界中告诉我。谢谢。 – jannagy02

+0

所以是的,你正在解决构造函数中的这些依赖关系,但你应该做的是让它们作为构造函数的参数。然后,创建该对象的类会将依赖关系注入到该对象中。 –

+0

不,我实际上将它们作为构造函数的参数。当我称之为“IEmployeeService employeeService = ObjectFactory.GetInstance ();” StructureMap使用所需的参数创建它。 EmployService的构造函数有两个构造函数参数(IEmployRepository,IShiftModelService),并且没有默认的构造函数。 – jannagy02

2

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

你应该避免ObjectFactory.GetInstance<IShiftModelService>(),让你的框架解决依赖关系自动使用YourImplementationOfControllerFactory

我没有使用结构映射在我的项目,但我一直在使用Castle Windsor,另外一个依赖注入框架。你也可以看看Ninject

不管怎样,有类似的很多框架步骤:

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

Global.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); 
    } 
} 

有几个有用的链接:

相关问题