代码之家  ›  专栏  ›  技术社区  ›  Ryan

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

  •  4
  • Ryan  · 技术社区  · 13 年前

    我想知道从将在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中的拳击和非拳击可能是一个痛点。有什么想法吗?

    2 回复  |  直到 13 年前
        1
  •  4
  •   ekim boran    13 年前

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

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

    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;}
    }
    
        2
  •  0
  •   AlwaysAProgrammer    13 年前

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

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