关于通用控制器/服务的设计模式

本文关键字:设计模式 服务 于通用 控制器 | 更新日期: 2023-09-27 18:21:37

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

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

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

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
}

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

关于通用控制器/服务的设计模式

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

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

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