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.
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));
}
}