提问者:小点点

API控制器和基础服务-参数验证的责任


也许这是一个微不足道的情况,但它对我来说很困惑,我需要一些澄清,如何以正确的方式处理它。

为了简单起见,模型如下:

(User被分配给许多项目,且project有许多用户被分配给)。

null

…\Api\v1\Projects\{projectId}\users\{userId}

允许两个http操作:

API控制器使用服务层来执行这些操作。服务接口为休闲状态:

void projectService.assignUser(int projectId, int userId)
void projectService.dismissUser(int projectId, int userId)

服务使用dbContext来执行这些操作。

问题1:哪个元素应该负责检查projectId和userId是否正确?IMHO最好把这个逻辑放在服务层,因为它可以重用。

问题2:如果projectId和userid不正确(例如:project/user不存在或不允许赋值),这些方法应该返回什么?

我的第一个想法是返回空值,但我认为这没有太大意义。主要是因为如果enitiyId不正确,service中的类似方法将返回null。例如:ProjectService.GetProject(projectId)如果项目不存在,则返回null

第二个方法是回击布尔。False至少有一个参数不正确

第三个想法是用Message抛出ArgumentException。它似乎是好的,但它使api控制器捕捉异常。


共2个答案

匿名用户

Q1)我认为将它们放置在服务层是一个有效的想法,我可以想到许多您可能想要重用这些方法的场景。

null

public class BusinessLogicMessage<T> where T : new()
    {
        public BusinessLogicMessage(T result)
        {
            Result = result;
            Status = BusinessLogicStatus.Success;
            Message = string.Empty;
        }

        public BusinessLogicMessage(T result, BusinessLogicStatus status, string message)
        {
            Result = result;
            Status = status;
            Message = message;
        }

        public BusinessLogicStatus Status { get; set; }
        public string Message { get; set; }
        public T Result { get; set; }
    }

    public class BusinessLogicMessage
    {
        public BusinessLogicMessage()
        {
            Status = BusinessLogicStatus.Success;
            Message = string.Empty;
        }

        public BusinessLogicMessage(BusinessLogicStatus status, string message)
        {
            Status = status;
            Message = message;
        }

        public BusinessLogicStatus Status { get; set; }
        public string Message { get; set; }
    }

    public enum BusinessLogicStatus
    {
        Success,
        Failure,
        Warning
    }

因此,如果方法成功,只需返回类的默认构造函数,该构造函数的状态为“成功”。如果失败或其他情况发生,您可以添加详细信息。如果需要为该方法返回特殊结果对象,则可以将其附加到结果

我的两分钱。

更新为更好的答案。

匿名用户

答案1:您应该不断验证ProjectId/UserID到服务层以供重用,并在任何需要的地方调用这些函数。

答案2:基于valid/invalid projectid/userid创建一个json。它可能包含与用户或项目相关的详细信息(如果两者都有效),并且在Id无效的情况下返回错误消息和错误Id(例如1表示无效的项目,2表示无效的用户)。

a)JsonObject ProjectService.AssignUser(int projectId,int userId)

EG:br>有效ID(两者):

stat":“OK”,“userId”:“userId here”,“projectId”:“projectId here}

无效的项目ID:

null

b.JsonObject ProjectService.DispersUser(int projectId,int userId)

有效ID(两者):

状态“:”OK}

无效的用户ID:

ErrorMsg:无效的用户ID,Stat:FaileError:2}