【问题标题】:Service layer - returning validation & functional results服务层 - 返回验证和功能结果
【发布时间】:2013-03-31 05:40:52
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net-mvc service-layer


    【解决方案1】:

    如果从您的服务层返回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;}
    }
    

    【讨论】:

    • 我最终做了 ServiceResult
    • @Ryan 代码严重错误,但我想你已经明白了。我已经修好了,你应该再检查一下。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,您对我的 ReturnObject 的看法是正确的。我解决了这个问题,但是我仍然必须在此转换中转换为调用层所需的任何类型,它将是一个 int。您还可以扩展我更改影响服务层的 UI 层吗?
    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2011-07-13
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多