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

时间:2013-04-08 23:48:33

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

我想知道从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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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