0

複数の CRM システムとの通信をサポートする C# で CRM ライブラリ (マネージャー) を開発したい場合、問題に直面しています。つまり、複数の CRM インスタンスを同時に実行している場合 (たとえば、2 つの異なる組織) )。

CRM ライブラリの要件:

  1. 遅延バインドではなく事前バインドを使用する (型の安全性のため)

  2. 一人のマネージャーを通じて、より多くの CRM システム (組織) と通信できる

  3. すべての CRM システム (組織) で使用される 1 つの操作 (コードの重複を避ける) に対して 1 つの方法のみ - 生成されたエンティティ ファイルを解析するためのユーティリティ (crmsvcutil ツール) を組織ごとに作成する必要があります。解析の結果は、エンティティ ファイルで定義されたエンティティのインターフェイスと部分クラスのリストになります。インターフェイスは、IAccountNumber など、含まれる属性に従って部分クラスで実装されます。インターフェイスには 2 つのグループがあります。最初のグループは、両方の組織で共通のエンティティ属性用です。たとえば、インターフェイス ICrmAccount は、AccountNumber、Name、Address1 属性などを定義します。 . インターフェイスの 2 番目のグループは、エンティティに固有であり、すべての CRM システム (組織) のエンティティには存在しない属性用です。

2 つの異なる CRM システムと通信できるソリューションを設計しましたが、特定のアカウントに対して実装されたインターフェイスを使用することはできません。コードのコメントを含む同封のソリューションを参照してください。

解決策は次の場所にあります。

ダウンロード用リンク

解決策の説明:

CRM_BusinessLogic - 通信のためのすべてのメソッドを保持し、コンストラクターで正しいデータ コンテキストを初期化する CRMManager が含まれています。

CRM_Interfaces - エンティティ ファイルの解析の結果として生成されたすべてのインターフェイスが含まれます (これは別の解析ツールで行う必要があります)。現在は、両方のデータ コンテキストで実装されているエンティティを含む iCRMContext と、両方のデータ コンテキストで実装されているエンティティを含む iCRMContext の両方に共通の 1 つの属性のみを保持する iCRMAccount のみが含まれています。現在、両方のコンテキストが同じエンティティ Account を実装しています。

CRM_SCEurope - 最初の CRM 組織 SC Europe 用に生成されたエンティティ ファイル - SCEuropeEntities.cs、解析ツールによって生成されたデータ コンテキスト (組織コンテキストに存在するエンティティに応じてインターフェイスのリストを実装) - SCEuropeContext_generated および SCEuropeContext.cs が含まれ、正しい組み立て

CRM_SoSW - CRM_SCEurope と同じ内容で、2 番目の CRM 組織に関連するデータが含まれています。

CRM_Test - 両方の組織と通信するテスト コンソール アプリが含まれています

同封のソリューションには、設計されたソリューションの基本的なテストには十分な名前パラメーターのみを持つ Account エンティティのみが含まれていることに注意してください。

重要: プロジェクトを実行する前に、Program.cs ファイル (CRM_Test プロジェクト) でマネージャーの資格情報を設定する必要があります。

アカウント データが、実装されたインターフェイス iCRMContext で生成された部分クラス (SoSwContext、SCEuropeContext) を使用して CRM から読み込まれるかどうかを見ることができるように、アプリケーションは例外「Invalid 'where' condition. An entity member is invoking an invalid property or method. - メソッドの実装を参照してください。".

誰かが例外を解決する方法を見つけてくれれば幸いです。

ありがとう

パベル

4

1 に答える 1

1

私の現在の雇用主には、複数の CRM 組織があり、いくつかはほぼ同一であり、実際にはまったく同じアーリー バインド クラスを使用でき、違いを処理するために 20 数行のカスタム コードを使用できます。他の組織はそうではないため、生成された事前バインド型を含む組織固有の名前空間を持つ個別の dll があります。それらがすべて同じ dll にないという理由はありませんが、それぞれが連絡先、予定などの独自の定義を定義するため、それらがすべて同じ名前空間にあると問題が発生します。

存在しない特定のフィールドまたはエンティティを選択または更新しようとしない限り、別の組織に早期バインド型を使用できることを覚えておいてください。したがって、Org 1 の Contact エンティティに CompanyId があり、Org 2 にはない場合でも、CompanyId を入力しない限り (つまり、エンティティ パラメータ コレクション)

于 2013-05-13T12:31:24.193 に答える