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

C# 服务层-返回验证和;功能结果,c#,asp.net-mvc,service-layer,C#,Asp.net Mvc,Service Layer,我想知道从ASP.NET MVC中使用的服务层返回验证结果的最佳实践或任何建议 选择1 public IEnumberable Foo(int-userId,out-videoId) { var validationResults=新列表(); //验证逻辑在这里。。。 videoId=\u videoService.AddVideo(); 返回验证结果; } 选择2 公共服务结果Foo(int userId) { var validationResults=新列表(); var servic

我想知道从ASP.NET MVC中使用的服务层返回验证结果的最佳实践或任何建议

选择1
public IEnumberable Foo(int-userId,out-videoId)
{
var validationResults=新列表();
//验证逻辑在这里。。。
videoId=\u videoService.AddVideo();
返回验证结果;
}
选择2 公共服务结果Foo(int userId) { var validationResults=新列表(); var servicesult=新servicesult(); //验证逻辑在这里。。。 serviceResult.ReturnObject=\u videoService.AddVideo(); serviceResult.ValidationResults=验证结果; 返回服务结果; } 公共类服务结果 { 公共IEnumberable验证结果{get;set;} 公共对象ReturnObject{get;set;} }
我目前正在做选项1,因为我认为选项2中的拳击和非拳击可能是一个难点。有什么想法吗?

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


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

如果从服务层返回
对象
,则必须在客户端代码中强制转换
返回对象
适当的类型/值。因此,类型检查被定义为运行时,如果不小心,将导致InvalidCastException。更重要的是,这是一个不雅观的解决方案,它会污染代码,从而降低代码的可理解性

如果只希望有一种类型,可以使用泛型:

public class ServiceResult<T>
{
    public IEnumberable<ValidationResult> ValidationResults { get; set; }
    public T ResultObject
    {
      get;set;
    }
}
公共类服务结果
{
公共IEnumberable验证结果{get;set;}
公共结果对象
{
获得;设置;
}
}
如果您不喜欢此解决方案,可以为每个服务方法定义结果类型

public class ResultBase
{
    public IEnumerable<ValidationResult> ValidationResults { get; set; }

}
public class RegisterResult : ResultBase
{
    public Video Video{get;set;}
}
公共类结果库
{
公共IEnumerable验证结果{get;set;}
}
公共类RegisterResult:ResultBase
{
公共视频{get;set;}
}

是的,关于我的ReturnObject,你是对的。我修复了这个问题,但是我仍然需要在调用层中转换为任何类型,在这个转换中,它将是一个int。你也可以在我的基础上扩展,更改影响服务层的UI层吗?我最终这样做了ServiceResult@Ryan代码严重错误,但我想你已经知道了。我已经修好了,你应该再检查一遍。
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;}
}