服务层 - 返回验证和功能结果

问题描述 投票:0回答:2

我想知道从将在 ASP.NET MVC 中使用的服务层返回验证结果的最佳实践或任何建议。

选项1

public IEnumerable<ValidationResult> Foo(int userId, out videoId)
{
    var validationResults = new List<ValidationResult>();
    
    // Validation logic goes here...
    
    videoId = _videoService.AddVideo();
    
    return validationResults;
}

选项2

public ServiceResult Foo(int userId)
{
    var validationResults = new List<ValidationResult>();
    var serviceResult = new ServiceResult();
    
    // Validation logic goes here...
    
    serviceResult.ReturnObject = _videoService.AddVideo();
    serviceResult.ValidationResults = validationResults;
    return serviceResult;
}

public class ServiceResult 
{
    public IEnumerable<ValidationResult> ValidationResults { get; set; }
    public object ReturnObject { get; set; }
}

我目前正在执行选项 1,因为我认为选项 2 中的装箱和拆箱可能是一个痛点。有什么想法吗?

c# asp.net-mvc service-layer
2个回答
4
投票

如果从服务层返回

object
,您必须在客户端代码中转换
returnobject
适当的类型/值。因此,类型检查会推迟到运行时,如果不小心,就会导致 invalidcastExceptions。更重要的是,这是一个不优雅的解决方案,会污染您的代码,从而降低代码的可理解性。

如果你只想拥有一种类型,你可以使用泛型:

public class ServiceResult<T>
{
    public IEnumerable<ValidationResult> ValidationResults { get; set; }
    public T ResultObject { get; set; }
}

如果您不喜欢这个解决方案,您可以为每个服务方法定义一个结果类型。

public class ResultBase
{
    public IEnumerable<ValidationResult> ValidationResults { get; set; }
}

public class RegisterResult : ResultBase
{
    public Video Video { get; set; }
}

0
投票

我会选择选项2。它看起来更干净。使用选项 2,您的服务对于调用代码来说就像一个黑匣子。 它将使您能够更改 UI 层而不影响服务层。

ServiceResult 类中的属性“ReturnObject”不应该被称为“Result”吗?或者在 Foo 方法中,它应该是

serviceResult.ReturnObject = _videoService.AddVideo();

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