我正在努力将我的桌面/WPF解决方案从使用服务定位器模式转换为使用依赖注入。到目前为止,这个过程相对轻松(因为在两种情况下都使用同一个UnityContainer):我只需删除每个对全局/静态ServiceLocator的调用,并将依赖项放在构造函数中。但是当涉及到一个存在于我的实体类之一的辅助服务时,我陷入了困境。
当前我有类似以下的代码:
一个单例帮助服务,它不包含任何状态,只有一些常用逻辑:interface ICalculationsHelper { double DoCompletelyCrazyCalculations(); }
然后,在领域模型实体中使用它:
class CrazyNumber
{
public int Id { get; set; }
public string Name { get; set; }
public double TheNumber { get; set; }
ICalculationsHelper _helper = ServiceLocator.Resolve<ICalculationsHelper>();
public CrazyNumber()
{
CreateCrazyNumber();
}
private void CreateCrazyNumber()
{
TheNumber = _helper.DoCompletelyCrazyCalculations();
}
}
...这对于Entity Framework来说不是问题,可以实现对象的具体化,而且我可以在许多方面使用这个类(例如:包装在ViewModels中、在列表中操作等),因为我只需要处理一个默认构造函数。
如果我这样做会发生什么(移除ServiceLocator并将依赖的helper放入构造函数中):
class CrazyNumber
{
public int Id { get; set; }
public string Name { get; set; }
public double TheNumber { get; set; }
ICalculationsHelper _helper;
public CrazyNumber(ICalculationsHelper helper)
{
_helper = helper;
CreateCrazyNumber();
}
private void CreateCrazyNumber()
{
TheNumber = _helper.DoCompletelyCrazyCalculations();
}
}
1) EF应该如何为每个实体注入一个新的帮助器? 2) 假设我的应用程序在100个地方以各种不同的方式操纵实体,而且都使用默认构造函数。现在突然间我必须修改每个算法,手动将ICalculationsHelper传递给实体。这会导致代码混乱,并使每个算法变得复杂。根据服务定位器模式,将这个“次要”的服务静默加载到后台似乎更加清晰。 3) 如果使用服务定位器在这种情况下更好,那么该域类应该如何进行单元测试(模拟服务)?
谢谢