1

我正在开发一个 Web 应用程序,它使用 Angular 12 作为前端,使用 ASP.NET Core 6 作为后端。在我们的团队中,我们通常将任何东西写成 3 层应用程序(如果可能的话),由表示层、业务逻辑层和数据层组成。在这个项目的情况下,这意味着例如当某种类型的所有实体(我们称之为它Car)从服务器请求时,会发生以下情况(简化):

  1. 请求到达CarController.cs控制器。这里的carManager实例属于业务层,提供与汽车实体交互的功能(大部分是 CRUD)。依赖注入用于将carManager实例注入控制器:

    public async Task<ActionResult<List<Car>>> GetCars()
    {
        List<Car> cars = await this.carManager.GetCarsAsync();
        return this.Ok(cars);
    }
    
  2. 如果有任何业务逻辑相关,将GetCarsAsync()carManager. 然而,在许多情况下,这不是必需的。因此,我经常以像这样调用数据层的相应函数的“愚蠢”函数结束。本carAccessor例中的 属于数据层。此处也使用依赖注入将其实例注入管理器:

    public async Task<ActionResult<List<Car>>> GetCarsAsync()
    {
        return this.carAccessor.GetCarsAsync();
    }
    
  3. 然后在实体的相应访问器中完成对数据的实际查询。例子:

    public async Task<List<Car>> GetCarsAsync()
    {
        List<Car> cars = new();
        List<TblCar> dbCars = await this.Context.TblCars.ToListAsync();
    
        foreach (TblCar dbCar in dbCars)
        {
            Car car = <AutoMapper instance>.Map<Car>(dbCar);
            cars.Add(car);
        }
    
        return cars;
    }
    

虽然这使得在应用程序中不混淆业务逻辑和数据访问变得很容易,但它确实创建了大量的代码,除了调用其他代码之外什么都不做。因此,在某些情况下,业务层只是因为懒惰而被省略,业务逻辑最终只是在其他地方实现,例如直接在控制器中实现。有一个简单的解决方案吗?

4

1 回答 1

0

使用泛型基类和继承可以帮助您减少在任何地方为 vanilla case 编写和维护类似代码:

public abstract class BaseController<T, C>: Controller  where T: class where C: IItemsManager<T>
{
    protected C ItemManager { get; }

    public virtual async Task<ActionResult<List<T>>> GetCars()
    {
        List<T> items = await this.ItemManager.GetItemsAsync();
        return this.Ok(items);
    }
}

public interface IItemsManager<T> where T : class
{
    Task<List<T>> GetItemsAsync();
}


public class ItemsManager<T, B>: IItemsManager<T> 
    where T: class 
    where B: class
{
    public virtual async Task<List<T>> GetItemsAsync()
    {
        List<T> items = new List<T>();
        List<B> dbItems = await this.Context.Set<B>().ToListAsync();

        foreach (B dbItem in dbItems)
        {
            T item = <AutoMapperinstance>.Map<T>(dbItem);
            items.Add(item);
        }

        return items;
    }
}

public class CarManager: ItemsManager<Car, TblCar>
{

}

public class CarController: BaseController<Car, CarManager>
{

}
于 2022-01-10T09:38:10.473 回答