0

私はWCFが初めてで、次の質問があります。

1) 複数の小さな WCF サービスではなく、1 つの大きな WCF サービスを作成したい。これは、ファサード デザイン パターンの実装のようなものです。

なんで?クライアントのセッションを行う必要があり、クライアントに関する機密情報 (アクセス トークン、ユーザー名、API キー) を保存して検証する必要があります。このようにして、プライベートフィールドを作成するだけです:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class ApplicationService : IApplicationService
{
     private string _accessToken;
     private string _userName;

     public OrderResponse GetOrder(OrderRequest request)
     {
          var response = new OrderResponse();
          var result = Validate(request, response);
          ... other code
     }

     public CustomerResponse GetCustomer(CustomerRequest request)
     {
          var response = new CustomerResponse();
          var result = Validate(request, response);
          ... other code
     }

     public LoginResponse Login(LoginRequest request)
    {
          var response = new LoginResponse();
          var result = Validate(request, response);
          ... other code
     }

     public LogoutResponse Logout(LogoutRequest request)
     {
          var response = new LogoutResponse();
          var result = Validate(request, response);
          ... other code
     }

     public bool Validate(BaseRequest request, BaseResponse response)
     {
          if(request.Token != _accessToken)
               return false;

          ... validate other fields

          return true   
     }

     // many other methods

}

2) 他のすべての WCF サービスを含む 1 つの大きなサービスを作成するとします。また、ファサード デザイン パターンの実装のようなものです。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class ApplicationService : IApplicationService
    {
         private string _accessToken;
         private string _userName;
         private LoginService _loginService;
         private CustomerService _customerService;
         private OrderService _orderService;

         public ApplicationService()
         {
              _loginService = new LoginService();
              _orderService = new OrderService();
              _customerService = new CustomerService();
         }

         public OrderResponse GetOrder(OrderRequest request)
         {
              var response = new OrderResponse();
              var result = Validate(request, response);
              if(!result) return Something;
              return _orderService.GetOrder(request);
         }

         public CustomerResponse GetCustomer(CustomerRequest request)
         {
              var response = new CustomerResponse();
              var result = Validate(request, response);
              if(!result) return Something;
              return _customerService.GetCustomer(request);
         }

         public LoginResponse Login(LoginRequest request)
         {
              var response = new LoginResponse();
              var result = Validate(request, response);
              if(!result) return Something;
              return _loginService.Login(request);
         }

         public LogoutResponse Logout(LogoutRequest request)
         {
              var response = new LogoutResponse();
              var result = Validate(request, response);
              if(!result) return Something;
              return _LoginService.Logout(request);
         }

         // many other methods
    }

これについてどう思いますか?

3) もう 1 つの質問: 失敗を検証するとき、何を返す必要がありますか? FaultException応答オブジェクトでエラー メッセージをスローするか、返すことができますか? グッドプラクティスとは?

ありがとう。

4

1 に答える 1

0

1 と 2 について: Facade を作成することは悪いことではありませんが、Facade を作成する目的が重要です。各リクエストで accessToken などを渡すことだけを達成したい場合は、おそらく SOAP ヘッダーでそれらを渡すことができます。また、.net クライアントを使用している場合は、動作拡張機能を利用して、各 WCF サービス リクエストでカスタム パラメーターを渡します。ブログ投稿を参照してください。

また、クライアントが GetToken から accessToken を取得したら、クライアントがそれを保存し、クライアントとサーバーでセッションを作成する代わりに、すべてのサービス呼び出しでそれを渡します。これは、サービスのスケーリングにも役立ち、セッションが失われた場合にサービスを機能させることができます。

このようにして、クライアント accessToken を検証し、ビジネス ロジックからクライアント検証ロジックを抽象化することもできます。

3 の場合: クライアント パラメーターを検証するときは、内部で SOAPFault が生成されるため、FaultException をスローすることをお勧めします。

于 2012-12-09T06:05:06.670 に答える