4

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

选项1

public IEnumberable<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 IEnumberable<ValidationResult> ValidationResults { get; set; }
    public object ReturnObject { get; set; }
}

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

4

2 回答 2

4

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

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

public class ServiceResult<T>
{
    public IEnumberable<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;}
}
于 2013-04-09T00:21:13.553 回答
0

我会选择选项 2。它看起来更干净。使用选项 2,您的服务就像调用代码的黑匣子一样。它将使您能够在不影响服务层的情况下更改 UI 层。

ServiceResult 类中的属性 'ReturnObject' 不应该称为 'Result' 吗?或者在方法 Foo 中,它应该是serviceResult.ReturnObject = _videoService.AddVideo();

于 2013-04-08T23:54:59.447 回答