Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【C#】【Dynamics CRM】事前バインディングの手順

Dynamics CRMでは.NETプログラム(CS・VB)を作成する際、事前バインディングという手法(ツール?)を提供しています。

毎度毎度やり方を確認しているので一度ちゃんとまとめておきたいと思います。

今回はDynamics CRM Onlineにて実施。

実施環境

Windows 8.0 Pro

Dynamics CRM Online 2015(7.0)

Dynamics CRM SDK(en 7.0.0)

参考URL

コード生成ツール (CrmSvcUtil.exe) を使用して事前バインド型エンティティ クラスを作成する

blogs.msdn.com

概要

概要については、Japan Dynamics CRM Team Blogの説明が一番わかりやすいので、引用しました。

サクッと言ってしまえば、通常記法ですとハードコーディングでDynamics CRMの各種フィールド名・エンティティ名などを記述しなければいけないところを、事前バインディングによってコードファイルを生成しておくことによって、各エンティティをデータクラスのように扱う(インテリセンスなども機能する)ことが可能になるというものです。 (説明合ってるかな……。)

事前バインド

SDK を利用した開発時に、エンティティに関連する操作を行うとします。提供されている SDK アセンブリは エンティティの情報を保持しておらず、またカスタムエンティティやフィールド情報を事前に知る由もない ため、以下のように記述する必要があります。

// 取引先企業オブジェクトの作成

Entity account = new Entity("account");

// 名前フィールドに値を設定

account["name"] = "サンプル取引先企業";

// Create メソッドでのレコード作成

accountId = _service.Create(account);

上記のように、エンティティ名やフィールド名は全て文字列として指定する必要があり、IntelliSense が 利用できません。また文字列に間違いがあってもコンパイル時にエラーが出ることはなく、実行時に 初めてエラーが確認できます。

一方事前バインドを利用した場合、以下のような記述が可能です。

Account account = new Account();

account.Name = "サンプル取引先企業";

accountId = _service.Create(account);

取引先企業オブジェクトは Account という型が利用でき、またフィールドも型指定可能です。よって 問題があればコンパイル時に分かりますし、IntelliSense も機能します。

実施概要

基本的にはCRMSDKに含まれるCrmSvcUtil.exeツールに各種パラメータを渡して、事前バインディングのcs(ないしvb)ファイルを生成します。

コード例

CrmSvcUtil.exe /url:https://***.api.crm7.dynamics.com/XRMServices/2011/Organization.svc /out:CrmOnlineBinding.cs /username:***@***.onmicrosoft.com /password:*** /namespace:CrmBinding

パラメータの【url】は Dynamics CRM トップ画面から、[設定]→[カスタマイズ]→[開発者リソース]の 組織サービス(プロトコルSOAP)を利用します。

【out】は生成される.csファイルの名前(デフォルトではC#ファイルで生成されます。)

【namespace】は生成されたcsファイルの名前空間に利用されます。

その他各種パラメータはMSDNを参照されたし。

手順

1.コマンドプロンプトを実行(管理者として実行が必要かも?)

2.ダウンロードしてきたSDKのフォルダへ移動 ~~~SDK\Bin

f:id:sugimomoto:20150407134411p:plain

3.上記コマンド例を実行。

f:id:sugimomoto:20150407134417p:plain

4.SDK.Binフォルダに~~~.csファイルが生成される。

f:id:sugimomoto:20150407134422p:plain

f:id:sugimomoto:20150407134511p:plain

生成されたコード例

//------------------------------------------------------------------------------
// <auto-generated>
//     このコードはツールによって生成されました。
//     ランタイム バージョン:4.0.30319.0
//
//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
//     コードが再生成されるときに損失したりします。
// </auto-generated>
//------------------------------------------------------------------------------

[assembly: Microsoft.Xrm.Sdk.Client.ProxyTypesAssemblyAttribute()]

namespace CrmBinding
{
    
    
    [System.Runtime.Serialization.DataContractAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("CrmSvcUtil", "7.0.0000.3543")]
    public enum AccountState
    {
        
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Active = 0,
        
        [System.Runtime.Serialization.EnumMemberAttribute()]
        Inactive = 1,
    }
    
    /// <summary>
    /// 顧客または見込み顧客を表す会社です。この会社には、業務取引で請求が行われます。
    /// </summary>
    [System.Runtime.Serialization.DataContractAttribute()]
    [Microsoft.Xrm.Sdk.Client.EntityLogicalNameAttribute("account")]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("CrmSvcUtil", "7.0.0000.3543")]
    public partial class Account : Microsoft.Xrm.Sdk.Entity, System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
    {
        
        /// <summary>
        /// Default Constructor.
        /// </summary>
        public Account() : 
                base(EntityLogicalName)
        {
        }
        

遅延バインディングを利用したCRM連携プログラム例

以下の様な形でレコードの作成などが可能です。

遅延バインディングと違い、フィールド名やエンティティ名をいちいち書かなくていいので、とても楽です。

ただし、Dynamics CRMをカスタマイズし直したら、もう一度事前バインディングファイルを生成し直さないといけません。

using System;
using CrmOnlineBinding;
using Microsoft.Xrm.Client;
using Microsoft.Xrm.Client.Services;

namespace MyProject.Binding
{
    class Program
    {
        static void Main(string[] args)
        {
            var connection = CrmConnection.Parse("Url=https://***.crm7.dynamics.com; Username=***@***.onmicrosoft.com; Password=***;");
            var service = new OrganizationService(connection);

            Account account = new Account();

            account.Name = "Crm Online Binding";

            Guid guid = service.Create(account);

            Console.WriteLine(guid.ToString());

            Console.ReadKey();
        }
    }
}

アジャイル的な開発になると利用しにくいシーンもあるかもですが。

それから、今回はすべてのエンティティを対象に出力しましたが、フィルターする方法もあるので、次回以降検証したいと思います。