4

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; }
}

オプション2のボックス化とボックス化解除が問題になる可能性があるため、現在オプション1を実行していました。何か案は?

4

2 に答える 2

4

objectサービス層から戻る場合returnobjectは、クライアント コードで適切な型/値をキャストする必要があります。したがって、型チェックはランタイムに延期され、注意しないと無効なキャスト例外が発生します。さらに重要なことは、コードを汚染し、コードの理解度を低下させる洗練されていないソリューションです。

タイプを 1 つだけにしたい場合は、ジェネリックを使用できます。

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;}
}
于 2013-04-09T00:21:13.553 に答える
0

オプション 2 を使用します。よりクリーンに見えます。オプション 2 では、サービスは呼び出し元のコードに対してブラック ボックスのようになります。サービス層に影響を与えることなく、UI 層を変更できます。

ServiceResult クラスのプロパティ 'ReturnObject' は 'Result' と呼ばれるべきではありませんか? またはメソッド Foo では、次のようにする必要があります。serviceResult.ReturnObject = _videoService.AddVideo();

于 2013-04-08T23:54:59.447 に答える