使用Web Api C#层架构从数据库中获取1个对象的最佳实践

问题描述 投票:-1回答:1

所以我知道我的问题似乎是基本的,但我想知道一段时间以来困扰我的事情,我的后端是在分层架构(repo-services-controllers)之后完成的

我有一个api调用,应该在提供他的id之后返回一个员工的json,所以url就像是api.mywebsite.com/api/employees/1

我的控制器看起来像这样:

public async Task<EmployeeDto> GetEmployee([FromUri] int eId)
{
    return GetService<IEmployeeService>().GetEmployeeById(eId);
}

我的问题是,当我得到这个对象时,我应该做什么检查?我是否应该检查员工是否被删除(软删除)?我显然应该检查它是否返回null(没有找到具有这样id的员工)

但是,如果我想检查实体是否被删除,我应该在存储库层还是服务层执行此操作?回购层:

public Task<Employee> GetSingle(int id)
{
    return GetDatabase().Employees.Where(x => x.EmployeeId== id && !x.Deleted).SingleOrDefaultAsync();
}

或在服务层上:

var emp= await GetTenantRepository<IEmployeeRepository>().GetSingle(eId);
if (emp==null)
{
    throw ...
}
if (emp.Deleted)
{
    throw ...
}

我是否过于思考它,如果我把它放在这里或那里并不重要?

c# asp.net-web-api design-patterns
1个回答
-1
投票

这完全是关于代码风格,架构哲学和选择的设计:)回答你关于“在哪里检查”的问题:这取决于你的图层的职责。所有代码示例仅供参考,不应视为直接解决方案

1)DAL(存储库) - 是从应用程序到存储的桥梁。它应该封装与数据库交互和数据库实现细节相关的所有内容。因此,如果缺少实体,可以从存储库接口返回null。

2)BL(服务) - 组合从存储库获取的原始数据并将一些业务规则/操作应用于它们。在简单的CRUD服务的情况下,它变得非常类似于存储库并且可以处理一些数据库异常,进行数据转换(将DAL对象映射到BL)等。再次,从BL层返回的null表示缺少实体。例如。根据您的代码,您可以在此处封装一些数据库不一致性,并将多个条目视为缺失值。 BL服务示例:

public async Task<EmployeeDto> GetEmployee(int eId)
{
    try
    {
        return GetService<IEmployeeService>().GetEmployeeById(eId);
    }
    catch (InvalidOperationException) //If it's suitable
    {
        return null;
    }
}

3)API层(控制器) - 是RESTFUL接口。它结合了服务的结果,并将其表示为资源,并返回状态代码和资源表示。如果缺少实体,最好的方法是从RESTFUL API返回404状态(HttStatusResult)。

public async Task<IHttpActionResult> GetEmployee([FromUri] int eId)
{
    var res = GetService<IEmployeeService>().GetEmployeeById(eId);

    return res == null ? (IHttpActionResult)NotFound() : Ok(res);
}

因此,您可以自由地检查任何图层上的缺失结果,但是以正确的方式执行。您的存储库永远不应该驱动API行为(我的意思是不应该为DAL上的资源开发代码。例如,资源对象不应该与DAL对象具有完全相同的道具),BL永远不应该影响DAL,反之亦然。

附:它超出了问题的范围,但看看IoC和DI。在我看来,你当前的DI实现并不是最好的。

© www.soinside.com 2019 - 2024. All rights reserved.