使用WebApi C#分层体系结构从数据库中获取1个对象的最佳实践

时间:2018-08-30 10:51:24

标签: c# asp.net-web-api design-patterns

所以我知道我的问题似乎很基本,但是我想知道一段时间以来一直困扰我的事情,我的后端是按照分层体系结构(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 ...
}

我是否也想得太多,是否放在这里或那里都没关系?

1 个答案:

答案 0 :(得分:-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);
}

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

P.S。它超出了问题的范围,但请看一下IoC和DI。在我看来,您当前的DI实现并不是最好的。

相关问题