0

私がやろうとしていることは次のとおりです。

1) 次の WCF サービス コントラクトがあります。

[ServiceContract]
public interface IUploadService
{
    [OperationContract]
    ServiceData Upload(Request request);
}

[DataContract]
public class Request
{
    [DataMember]
    public long AbnNumber;

    [DataMember]
    public string Email;
}

2) このコントラクトは次のように実装されます。

public class UploadService : IUploadService
{
    public bool Upload(Request request)
    {
       // Some code
    }
}

「いくつかのコード」セクションでは、クライアントのリクエストを検証するために検証クラスを呼び出したいので、次のようにします。

var result = validation.ValidateRequest(request);

だから私の質問は:Uploadメソッド内で検証クラスのインスタンスを作成するのは悪い考えですか? このような:

public class UploadService : IUploadService
{
    public bool Upload(Request request)
    {
       var validation = new Validation();

       var result = validation.ValidateRequest(request);
    }
}

コンストラクターを作成することでこれを回避できることは知っていますが、私が知る限り、WCF サービス実装クラス内にコンストラクターを作成することはできませんか、それとも間違っていますか?

私は WCF を初めて使用するので、完全に間違った方向に向かっている場合はお知らせください。

ありがとう

4

2 に答える 2

1

個人的には、自分のサービス メソッドはできるだけ少なくしたいと思っています。アップロードを処理する別のプロジェクトが必要です。これにより、このコードをより簡単に再利用でき、サービスを作成せずに機能をテストできます。

このように Validation を作成する必要があるかどうかは、それが何をするかによって異なりますが、一般的には、Validation クラスが ValidateRequest(Request) を含むインターフェイスを実装してから、それを挿入するようにします。必要に応じて、テストでそれをモックできます。

したがって、サービスコードは次のようになります

public class UploadService : IUploadService
{
    private readonly IUploadHandler _uploadHandler;

    public UploadService(IUploadHandler uploadHandler)
    {
        _uploadHandler = uploadHandler;
    }

    public bool Upload(Request request)
    {
       //would possibly do some mapping here to create a different type of object to pass to the handler
       _uploadHandler.Upload(request);
    }
}

別のプロジェクトのハンドラーは次のようになります

public class UploadHandler : IUploadHandler
{
    private readonly IValidation _validator;

    public UploadHandler(IValidation validator)
    {
        _validator = validator;
    }

    public bool Upload(Request request)
    {
        return _validator.ValidateRequest(request);
    }
}
于 2013-04-05T09:45:57.407 に答える