我想知道从将在 ASP.NET MVC 中使用的服务层返回验证结果的最佳实践或任何建议。
public IEnumerable<ValidationResult> Foo(int userId, out videoId)
{
var validationResults = new List<ValidationResult>();
// Validation logic goes here...
videoId = _videoService.AddVideo();
return validationResults;
}
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 中的装箱和拆箱可能是一个痛点。有什么想法吗?
如果从服务层返回
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; }
}
我会选择选项2。它看起来更干净。使用选项 2,您的服务对于调用代码来说就像一个黑匣子。 它将使您能够更改 UI 层而不影响服务层。
ServiceResult 类中的属性“ReturnObject”不应该被称为“Result”吗?或者在 Foo 方法中,它应该是
serviceResult.ReturnObject = _videoService.AddVideo();