cub-e.net

just coding...

Early ve Late Binding Arasındaki Farklar

Dynamics CRM 2011 ve sonrasinda CRM içerisinde programcılar kendilerine birden fazla programlama biçimi seçebilirler. Dynamics CRM’de WSDL kullanarak early-bound tipleri ve Dynamics Entity sınıflarını kullanarak da late-bound programlama yapabilirsiniz. Plug-in ve Workflow yazabilmek için late-bound tipleri kullanmamız gerekmektedir.

Dynamics CRM 4.0’da entity sınıflarının duruşu aşağıdaki şekildeki gibiydi;

Şimdi ise Dynamics CRM 2011’de bu yapı şu şekilde değişti;

DynamicEntity sınıfı artık Entity sınıfı isimli bir sınıfla yer değiştirdi. Bunun anlamı ise build time yani early bound tiplerle, runtime yani late bound tiplerin artık tek sınıftan türemesinin gerçekleşmiş olduğudur.

Dynamics CRM’de artık WSDL’e direkt ulaşamıyoruz. Daha önceki makalemde de anlattığım gibi 2 tane dll’i referans olarak eklemek ve servise bağlantı kurmak gerekmektedir.

Late-Bound olarak isimlendiren mimaride siz Entity sınıfından bir nesne türetmeli ve bu nesnenin attribute collection’da da değerlere yer vermelisiniz. Tabii burada değer alanlarının crm içerisindeki logical name’lerini kesinlikle bilmeniz gerekmektedir.

Aşağıdaki örnek bize late-bindig yapısının nasıl işlediğini gösterecektir;

Entity lead = new Entity("lead");

lead.Attributes["subject"] = "Deneme Firmasi";

lead.Attributes["firstname"] = "Baris";

lead.Attributes["lastname"] = "KANLICA";

lead.Attributes["companyname"] = "Mawens Business Solutions";

lead.Attributes["numberofemployees"] = 20;

Guid leadid = service.Create(lead);

Entity sınıfını kullanmaya başladığımız zaman late-binding’e giriş yapmış oluyoruz. Entity türünden oluşturduğumuz nesneye biz Lead türünden bilgileri içine dolduracağız diyoruz. Contact, Opportunity gibi CRM içerisindeki bütün nesneleri bu şekilde oluşturabiliriz.

Daha sonra ise alanların logical name’lerini vererek bunların değerleri veriyoruz. Burada .net tabanlı türleri kullanabilmekteyiz. CRM 4.0’da CrmBoolean, CrmNumber gibi türlere çeviriler yaparak nesnelerin içini doldururken artık buna ihtiyacımız bulunmamaktadır.

service isimli WCF tabanlı servisimizden türemiş nesnenin Create Metodunu kullanarak nesnemizi CRM içerisinde bir kayıt olarak oluşturuyoruz.

Early-Bound olarak isimlendirilen mimaride de ise CrmSvcUtil.exe aracını kullanarak bir OrganizationServiceContext türetmelisiniz. Daha sonra ise bu aracın türettiği nesneleri kullanabilir hale gelebilirsiniz. Tabii burada her bir nesnenin şema isimleriyle hareket ettiğimiz unutulmamalıdır.

Aşağıdaki örnek bize early-binding yapısının nasıl işlediğini gösterecektir;

CrmDataContext orgContext = new CrmDataContext(ServiseBaglan());

 

var contact = new Contact()

{

    FirstName = "Alan",

    LastName = "Smith"

};

orgContext.AddObject(contact);

 

orgContext.SaveChanges();

 

Burada ServiseBaglan() daha önceki makelemde belirttiğim gibi IOrganizationService Interface’inden türemiş bir sınıfı teşkil  etmektedir. Yani CRM’in WCF servisine hazır ve açık bir bağlantıdır.

Contact ise CRM içerisinde kişiler entity’sidir, Account, Lead, Invoice,Quote gibi daha bir çok entity bulunmaktadır.

Firstname ve Lastname ise kişinin adı ve soyadı için değerleri temsil etmektedir  ve bu bilgi OrganizationContext’ten gelmektedir. Bir sonraki yazında CrmDataContext isimli bu OrganizationContext’in CrmSvcUtil.exe aracılığıyla nasıl oluşturulduğu göstereceğim.

Daha sonra ise bu doldurduğumuz contact nesnesini OrganizationContext’e teslim ediyoruz ve işlem yapılması için SaveChanges() metodumuzu çağırıyoruz.

Farklılıkları ise şu şekilde sıralayabiliriz;

·         Early-Bound Entity Sınıflarının en büyük avantajı compile time da bize bütün hataları göstermesidir. Yani uygulamamızı yazarken ya da derlerken türler arası uyumsuzluk ya da yanlış değer atama gibi bütün yanlışlıklarımızı gözler önüne sermektedir. 

·         CrmSvcUtil bize tüm CRM mimarisini örneklerken bütün nesneleri ve onun ilişkilerini de getirmektedir. Böylece nesne dönüşümleri ve tür güvenliği de sağlanmış olmaktadır.

·         Visual Studio içerisinde inteli sense özelliğini kullanmamızı sağlar.

·         Dynamics CRM 4.0’dan beri WSDL ile çalışan kişiler bu yeni yapıda hiçbir farklılık hissetmeyeceklerdir.

CrmSvcUtil.exe ile Early-Bound Sınıflar Oluşturmak

Early-Bound tiplerle çalışabilmek için obje modelini bilmeye ihtiyacımız vardır. İşte CrmSvcUtil.exe bize bu kodu üretecek olan programdır.

Program early-bound .Net Framework sınıflarını ve entity modellerini Microsoft Dynamics CRM 2015 içerisinden almakta ve bize bir .cs dosyası halinde vermektedir. Bu noktadan sonra üretilen bu .cs dosyasını ya Visual Studio ile kodunuzun bir parçası olarak kullanabilir ya da bir dll haline getirip projenize referans olarak ekleyebilirsiniz. Bu sayede Visual Studio içerisinde intelli-sense özelliği ile kod geliştirebilirsiniz.

Eğer isterseniz uygulama her bir entity için ayrı bir partial class’da oluşturabilir.

CRM’in SDK’sında bin klasörü içerisinde bulabileceğiniz bu aracı command prompt ile çalıştırabilirsiniz.
crmsvcutil.exe            

/url: buraya Organization Service’in adresi gelecek

/out: çıktının hangi dosyaya olacağı bilgisi

/username : servise bağlanılacak kullanıcı adı

/şifre : servise bağlanılacak şifre

Eğer CRM’de zaten kullanıcı olan bir kişi ile oturum açtıysanız k.adı ve şifre belirtmenize gerek yok.

Bu şekilde gerekli cümleyi command promt’a yazdığınızda yukarıdaki ekranda olduğu gibi .cs dosyanızı alabilirsiniz.

Ek olarak aşağıdaki parametreleri de verebilirsiniz;

/serviceContextName: Eğer .cs dosyanızı LINQ Service Context vasıtasıyla LINQ sorgularını da desteklemesini istiyorsanız bu özelliği kullanmalısınız. Buraya türetilecek servis context’inin adını girmelisiniz örneğin “CrmDataContext” gibi.

Burada ek olarak şunu da belirtmeliyim ki bu komutu varsayalında ben hep kullanıyorum. Bu komutu kullandığımız zaman  2 şeyi unutmamız gerekmekte;

1.      Bir OrganizationContext oluşmakta artık onu kullanmamız gerekmekte, aşağıdaki örnekte olduğu gibi;

CrmDataContext orgContext = new CrmDataContext(ServiseBaglan());

2.      Crm Servis çağrısına şu özelliği eklememiz gerekmekte;

_serviceproxy.EnableProxyTypes();

 

Bu iki maddenin detayını LINQ ile veri  sorgulama makalemde daha detaylı anlatacağım.

/namespace : Varsayılanda .cs dosyası bir namespace olmadan türetilir bu özelliği kullanarak kodu bir namespace altında toplayabilirsiniz.

 /language : CrmSvcUtil.exe varsayılanda C# kodu üretil eğer VB kodu üretmek istiyorsanız bu özelliğe VB değerini vermeniz gerekmekte.

Bu tool aşağıdaki örnekte olduğu gibi bir kod üretmektedir;

 

    /// <summary>

    /// Bir müşteriyi veya potansiyel müşteriyi temsil eden işletme. Ticari işlemlerde faturalanan şirket.

    /// </summary>

    [System.Runtime.Serialization.DataContractAttribute()]

    [Microsoft.Xrm.Sdk.Client.EntityLogicalNameAttribute("account")]

    [System.CodeDom.Compiler.GeneratedCodeAttribute("CrmSvcUtil", "5.0.9688.1244")]

    public partial class Account : Microsoft.Xrm.Sdk.Entity, System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged

    {

 

        /// <summary>

        /// Default Constructor.

        /// </summary>

        public Account() :

            base(EntityLogicalName)

        {

        }

 

        public const string EntityLogicalName = "account";

 

        public const int EntityTypeCode = 1;

 

        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

 

        public event System.ComponentModel.PropertyChangingEventHandler PropertyChanging;

 

        private void OnPropertyChanged(string propertyName)

        {

            if ((this.PropertyChanged != null))

            {

                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));

            }

        }

Yorumlar (2) -

  • Hüseyin

    16.11.2016 00:46:38 | Yanıtla

    Öncelikle makaleleriniz için çok teşekkür ederim. Gerçekten sade ve anlaşılır. Bu yazınızı okurken aklıma bir konu takıldı. Plugin ve workflow yazarken late-bound tipleri kullanmamız gerektiğini belirtmişsiniz. Bu noktada late-bound yerine early-bound classlarımızı ılmerge vb. bir uygulama ile plugin veya workflow dll ile merge edip kullanamaz mıyız?

    • Baris

      16.11.2016 05:18:05 | Yanıtla

      Merhaba Huseyin, early-bound tipleri de kullanabilirsiniz ama islem suresi acisindan farklilik olusturuyor.

      Cok yogun sistemlerde late-bound kullanmak daha mantikli. Ben genelde gunde milyonlarca transactionlarin yapildigi sistemlerde calistigim icin late-bound kullaniyorum ve hep bunu oneriyorum.

      Aslinda oradaki cumleyi late-bound kullanmanizi tavsiye ederim diye degistirmek daha mantikli olacak Smile

Loading