2016-09-08 5 views
0

私は、サードパーティのwsdlの年次変更を受け入れるようにアプリケーションコードを準備しようとしています。私は作ることができず、このwsdlのデザインを支配することはできません。このwsdlのオブジェクトは、変更されたり、アイテムが追加されたり、削除されたりすることがあります。しかし、私はまだwsdlの以前のバージョンを保持する必要があります。複数の名前空間を実装するメソッドをリファクタリングする

wsdlと同じように、サービスリファレンスとして現在のwsdlを追加する予定です。

現時点では、以下のような複数の方法があります(下記を含む)。

TaxYearプロパティを使用して、実際に参照するものを「:Service2015」または「Service2016」と決定します。私はwsdlのオブジェクトを表す汎用オブジェクトを渡しており、親メソッドで使用するオブジェクトに対してはrefというパラメータを渡しています。

このようなレパコットリングは、膨らみがたくさんあります。私がやろうとしていることをやり遂げるには、より良い方法が必要だと思っています。

C#を使用してこれを行うより良い方法がありますか、これは私が達成するために必要なことを実行するための最良で最も不便な方法です。

private static void RetrieveRequestObject(ref object objRequest, object objBusinessHeader, object objSecurityHeader, object objManifestHeader, object objFormData) 
{ 
    if (TaxYear.Equals(2015)) 
    { 
     objRequest = new Service2015.BulkRequestTransmitterRequest() 
     { 
      ACABusinessHeader = (Service2015.ACABulkBusinessHeaderRequestType)objBusinessHeader, 
      Security = (Service2015.SecurityHeaderType)objSecurityHeader, 
      ACATransmitterManifestReqDtl = (Service2015.ACATrnsmtManifestReqDtlType)objManifestHeader, 
      ACABulkRequestTransmitter = (Service2015.ACABulkRequestTransmitterType)objFormData 
     }; 
    } 
    else if (TaxYear.Equals(2016)) 
    { 
     objRequest = new Service2016.BulkRequestTransmitterRequest() 
     { 
      ACABusinessHeader = (Service2016.ACABulkBusinessHeaderRequestType)objBusinessHeader, 
      Security = (Service2016.SecurityHeaderType)objSecurityHeader, 
      ACATransmitterManifestReqDtl = (Service2016.ACATrnsmtManifestReqDtlType)objManifestHeader, 
      ACABulkRequestTransmitter = (Service2016.ACABulkRequestTransmitterType)objFormData 
     }; 
    } 
} 
+0

私はあなたがBulkRequestTransmitterRequestの2016バージョンを使用する必要があると賢明なサービス要求だと思います。 2015年の提出の場合でも年ごとの差別化は、添付ファイルで送信される「ペイロード」xml(1094 \ 1095の組み合わせ)にのみ適用する必要があります。 – fatherOfWine

+0

あなたは正しいです。 Webサービス所有者とのいくつかの対応は、送信のエンドポイントが変更されないことを示しました。したがって、FormDataのXMLを変更するだけで済みます。これに対する私の解決策は、毎年必要なFormData用の「テンプレート」XML文書を作成することでした。 Webサービスの所有者は、チェックする必要があるスキーマを判断するためにマニフェストのTaxYearを調べます。私はこれを投稿したことを忘れて、答えを追加してこの投稿を更新します。 – Russ

+0

私はxsdsからクラスを作成してしまったので、それらのクラスを作成してxmlにシリアライズします。 – fatherOfWine

答えて

0

について考えることができないため、それはなり、よりよい解決策を存在する可能性があります私は.wsdlファイルの異なるエンドポイントまたは年々のバージョンを混乱させる必要はありません。送信は年に関係なく同じエンドポイントで行われ、年の間にスキーマを検証するために、Webサービスの所有者は、検証するスキーマを決定するために、送信マニフェストのTaxYear要素をチェックします。

これに対応するために、2つの別々のXML「テンプレート」文書があります。それぞれの所要課税年度:2015年と2016年です。アプリケーションは、送信しようとしているデータに基づいてマニフェストで使用されるTaxYearの値)。

私はこれらのテンプレートを、フォームデータXMLに含まれるすべての要素に基づいて手作業で作成しました。繰返し要素グループには単数のインスタンスしかありません。これらの複数のインスタンスがアプリケーション内に作成されます。

私のアプリケーションはXMLテンプレートを読み込み、そこから見つかったダミー値をデータから取り出された値に置き換えます。私は、スキーマバージョンによって指示されるXMLから未使用または無効な要素を削除します。繰り返さなければならない要素(1095-Cや1094-Cフォームのパート3など)を作成/複製します。これまでのところ、このアプローチは最初のテストを通じて非常にうまく機能しているようです。

0

リフレクションを使用して、このような何かをやってみてください。

例:

namespace Stackoverflow 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int objBusinessHeader = 1, 
      objSecurityHeader = 2, 
      objManifestHeader = 3, 
      objFormData = 4; 

      var obj = (IService)RetrieveRequestObject(2010, objBusinessHeader, 
       objSecurityHeader, 
       objManifestHeader, 
       objFormData); 

      Console.WriteLine(obj.GetValues()); 


      var obj2 = (IService)RetrieveRequestObject(2011, objBusinessHeader, 
       objSecurityHeader, 
       objManifestHeader, 
       objFormData); 

      Console.WriteLine(obj2.GetValues()); 

      Console.ReadKey(); 
     } 

     private static object RetrieveRequestObject(int taxYear, object objBusinessHeader, 
      object objSecurityHeader, object objManifestHeader, object objFormData) 
     { 
      var serviceInstance = Activator.CreateInstance("Stackoverflow", 
       "Stackoverflow.Service" + taxYear).Unwrap(); 

      var serviceInstanceType = serviceInstance.GetType(); 

      var aCABusinessHeaderInfo = serviceInstanceType.GetProperty("ACABusinessHeader"); 
      var securityInfo = serviceInstanceType.GetProperty("Security"); 
      var aCATransmitterManifestReqDtlInfo = serviceInstanceType.GetProperty("ACATransmitterManifestReqDtl"); 
      var aCABulkRequestTransmitterInfo = serviceInstanceType.GetProperty("ACABulkRequestTransmitter"); 

      aCABusinessHeaderInfo.SetValue(serviceInstance, objBusinessHeader, null); 
      securityInfo.SetValue(serviceInstance, objSecurityHeader, null); 
      aCATransmitterManifestReqDtlInfo.SetValue(serviceInstance, objManifestHeader, null); 
      aCABulkRequestTransmitterInfo.SetValue(serviceInstance, objFormData, null); 

      return serviceInstance; 
     } 
    } 

    interface IService 
    { 
     string GetValues(); 
    } 

    class Service2011 : IService 
    { 
     public int ACABusinessHeader { get; set; } 
     public int Security { get; set; } 
     public int ACATransmitterManifestReqDtl { get; set; } 
     public int ACABulkRequestTransmitter { get; set; } 

     public string GetValues() 
     { 
      return [email protected]"Service 2011 - {ACABusinessHeader} {Security} {ACATransmitterManifestReqDtl} 
       {ACABulkRequestTransmitter}"; 
     } 
    } 

    class Service2010 : IService 
    { 
     public int ACABusinessHeader { get; set; } 
     public int Security { get; set; } 
     public int ACATransmitterManifestReqDtl { get; set; } 
     public int ACABulkRequestTransmitter { get; set; } 

     public string GetValues() 
     { 
      return [email protected]"Service 2010 - {ACABusinessHeader} {Security} {ACATransmitterManifestReqDtl} 
       {ACABulkRequestTransmitter}"; 
     } 
    } 
} 

PS - 今私は、Webサービスの所有者とのいくつかの対応後に任意のより良い

+0

私はこれを簡単にテストしました。アセンブリ名は ''テストプロジェクト ''で、' 'CreateInstance'メソッドが探しているリファレンスは' 'test_project.BulkRequestService_" + TaxYear + ".BulkREquestTransmitterRequest" 'です。それは '' Service2015 ''や' 'Service" + TaxYear'の ''使用するためにエイリアスを使うのが好きではありませんでした。 'serviceInstance.GetType()'は、私が期待している型ではなく、 'ObjectHandle'型を返します。これはBulkRequestTransmitterRequestだと思います。 – Russ

+0

これは通常、Unwrapメソッドを呼び出す必要があります。私は完全な機能の例で私の答えを更新します。 – user1845593

関連する問題