我想知道从ASP.NET MVC中使用的服务层返回验证结果的最佳实践或建议。
public IEnumberable<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 IEnumberable<ValidationResult> ValidationResults { get; set; }
public object ReturnObject { get; set; }
}
我目前正在做选项1因为我认为选项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();