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

C# 关于通用控制器/服务的设计模式,c#,asp.net-mvc,generics,service,C#,Asp.net Mvc,Generics,Service,处理mvc+WebAPI应用程序的一些设计选项。我想问的问题是“你会如何做得更好,或者下面的声音是什么?” 我们有两个服务,一个是crud,另一个是针对支持扩展方法的实体的扩展服务。然后,我们必须使用根据服务提供功能的通用控制器。例如,每件事都简化了 注意:ICrudService是CrudService的接口,IExtendedCrudService继承ICrudService public class CrudService<T> { protected readonly

处理mvc+WebAPI应用程序的一些设计选项。我想问的问题是“你会如何做得更好,或者下面的声音是什么?”

我们有两个服务,一个是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
}
公共类CrudService
{
受保护的只读IUnitOfWork;
公共CrudService(IUnitOfWork unitOfWork)
{
UnitOfWork=UnitOfWork;
}
//积垢等的处理方法
}
公共类ExtendedCrudService:CrudService
{
公共扩展CrudService(IUnitOfWork unitOfWork):基础(unitOfWork)
{
}
//扩展功能的方法
}
公共抽象类控制器库
{
私有只读ICrudService(u crudService);
公共控制器数据库(ICrudService crudService)
{
_crudService=crudService;
}
//积垢的行动
}
公共摘要扩展ControllerBase:ControllerBase
{
私有只读IExtendedCrudService\u extCrudService;
公共扩展控制器数据库(IExtendedCrudService extCrudService):基本(extCrudService)
{
_extCrudService=extCrudService;
}
//扩展内容的操作
}

所有扩展实体将使用与控制器继承中未扩展实体相同的crud内容。映射=使用自动映射和DI。那么,你会采取不同的做法吗?如果会,怎么做?为什么?试图掌握这些场景中最常用的内容,因此非常感谢所有输入。

我经常使用这种设计模式。在我看来,使用接口可以更容易地进行单元测试。我建议为您的所有服务创建接口,在实现服务的类中,创建两个构造函数——一个像上面一样接受所有必要的接口,但也是一个接受新类的默认构造函数——以您的CrudService为例,我还将添加以下内容:

public CrudService() : this(new UnitOfWork())
{
}
这将允许您使用无参数构造函数以及参数化构造函数