0

为 mvc + web api 应用程序处理一些设计选项。我想问的问题或多或少是'你会如何做得更好,或者是下面的声音'

我们有两种服务,一种是 crud,另一种是为支持扩展方法的实体扩展的。然后,我们必须根据服务提供功能的通用控制器。例如,一切都简化了。

注意:ICrudService 是 CrudService 的接口,IExtendedCrudService 继承了 ICrudService。

public class CrudService<T>
{
   protected readonly IUnitOfWork UnitOfWork;

   public CrudService(IUnitOfWork unitOfWork)
   {
      UnitOfWork = unitOfWork;
   }
   //Methods for crud and so forth
}

public class ExtendedCrudService<T> : CrudService<T>
{
   public ExtendedCrudService(IUnitOfWork unitOfWork) : base(unitOfWork)
   {
   }
   //Methods for extended functionality
}

public abstract class ControllerBase<T>
{
   private readonly ICrudService<T> _crudService;

   public ControllerBase(ICrudService<T> crudService)
   {
      _crudService = crudService;
   }
   //Actions for crud stuff
}

public abstract ExtendedControllerBase<T> : ControllerBase<T>
{
   private readonly IExtendedCrudService<T> _extCrudService;

   public ExtendedControllerBase(IExtendedCrudService<T> extCrudService) : base(extCrudService)
   {
      _extCrudService = extCrudService;
   }
   //Action for extended stuff
}

所有扩展实体都将使用与控制器继承中没有扩展的相同的杂物。映射 = 使用自动映射和 DI。那么你会以不同的方式做这件事,如果是的话,如何以及为什么?试图掌握这些场景中最常使用的内容,因此非常感谢所有输入。

4

1 回答 1

1

我经常使用这种设计模式。使用接口可以更容易(在我看来)单元测试。我建议为您的所有服务创建接口,并在实现服务的类中创建两个构造函数 - 一个像上面一样采用所有必要的接口,但还有一个采用新类的默认构造函数 - 使用您的以 CrudService 为例,我还要输入以下内容:

public CrudService() : this(new UnitOfWork())
{
}

这将允许您使用无参数构造函数以及参数化构造函数。

于 2013-07-09T01:21:10.223 回答