Dynamics CRM
üzerinde uygulama geliştirebileceğiniz çok güçlü bir mimari ile gelmektedir. Bu
mimarinin temel yapı taşı ise WCF servisleridir. Bu yazımda sizlere CRM'in
temel web servisleri olan Discovery ve Organization Servislerinin yapısını ve
ne işe yaradıklarını anlatacağım.
CRM için kod
geliştirirken her ne kadar sdk'nın içinden çıkan dll'leri kullansak da bu
dll'ler vasıtasıyla ilk önce servis bağlantısı oluşturmamız
gerekmektedir. Yani verilere ulaşmak ve veri yazmak için WCF servislerini
kullanmak zorundayız. Bu servislerle daha hızlı ve güvenli bir şekilde CRM
platformuna entegre olmamızı sağlamaktadır.
WCF
standartlaşmış bir teknoloji olduğu için biz yazılım geliştiricilere yeni
özellikler sunmakta ve sürekli kendi içerisinde gelişmektedir. Dynamics CRM
yapısında entity ve attribute katmanlı bir mimari bulunmaktadır. Yani biz
CRM'in Business Logic katmanına müdahele edip yazılımlarımızı onunla entegre
hale getirmekteyiz. Temel olarak nesne katmanı Entity isimli nesneden
türemiştir. late-bound türlerde bu nesneyi sıklıkla kullanmaktayız. Early-bound
olarak program geliştirme metodolojisini tercih edersek Entity class'ı ile
işimiz olmamaktadır ama arka planda bütün nesnelerin bu class'dan türediği
unutulmamalıdır. Bu konuya aşağıda bir örnekle tekrar değineceğim. CRM
servislerine OrganizationServiceProxy ve DiscoveryServiceProxy sınıflarıyla
bağlanmaktayız. Aşağıdaki kod bize bunu göstermektedir;
using (OrganizationServiceProxy
_serviceProxy =
new OrganizationServiceProxy(organizationUri,
homeRealmUri, userCredentials, deviceCredentials)) ;
Discovery Servis
Dynamics CRM 4.0 versiyonundan itibaren multi-tenant bir mimaridedir. Yani tek bir uygulama
birden fazla organizasyonu içerisinde barındırmaktadır. Yazılımcı olarak birden
fazla organizasyon arasında geçiş yapmamız gerekiyorsa sistemde hangi
organizyonlar olduğunu sorgulama işini Discovery servis ile yapmamız
gerekmektedir. Bu servis yazma okuma işlemlerinin yapılacağı ana servise
bağlanmamıza yardımcı olacak ve organizasyonların bilgisini bize döndürecektir.
Aşağıdaki kod bize bu servise nasıl bağlanacağımızı ve organizasyonların
bilgisine nasıl ulaşacağımızı göstermektedir.

Uri dInfo = new Uri("http://192.168.5.102/XRMServices/2011/Discovery.svc");
ClientCredentials clientcred = new ClientCredentials();
DiscoveryServiceProxy dsp = new DiscoveryServiceProxy(dInfo,
null, clientcred, null);
dsp.Authenticate();
RetrieveOrganizationsRequest rosreq = new
RetrieveOrganizationsRequest();
RetrieveOrganizationsResponse r = (RetrieveOrganizationsResponse)dsp.Execute(rosreq);
foreach (OrganizationDetail o in r.Details)
{
Console.WriteLine("Organizasyon Adı : " + o.FriendlyName);
}
Console.ReadLine();
Normalde
dokümantasyonlarda bu sekilde bir ayrim göremezsiniz. Ben bunu deneyimlerime
dayanarak yapıyorum. Aslinda yukarıdaki kod da Online Organizasyon’a baglanir
ama DiscoveryService’in varsayilan yapici metoduna 4. Parametreyi gönderirseniz
yani DeviceCredential null olmazsa calisir.Sorun ise DeviceCredential’i
oluşturmak icin CRM SDK\SampleCode\CS\HelperCode klasöründeki DeviceIdManager.cs
kodunu kendi kodunuza implemente etmeniz gerekmekte.
Bu kodla
discovery servise bağlandıktan sonra ClientCredentials'ı kullanarak hali
hazırda oturum açmış kullancının bilgisini sisteme göndermekteyiz. Ama her
zaman bunu kullanmak istemeyebiliriz yani başka bir kullanıcı adı ve şifre ile
sisteme girmek istediğimizde ClientCredentials'a kullanıcı adı, şifre bilgilerini
verebiliriz.
clientcred.Windows.ClientCredential = new
System.Net.NetworkCredential("kullanici adi", "sifre", "domain");
Yukarıdaki
kodun çalışabilmesi için System.ServiceModel.Description,System.Runtime.Seriliazation,
Microsoft.Crm.Sdk.Proxy ve Microsoft.Xrm.Sdk dll'lerinin referanslara eklenmiş
olduğundan emin olun. Ayrıca uygulamayı .Net Framework 4.5.2'de derlemek
gerekiyor.
Dynamics CRM
2015'in ana web servisi Organization Servis'tir. Bu servis içerisinde entity
instance'ları üzerinde işlem yapabileceğimiz 6 metod ve execute metodu
bulunmaktadır. CRM Servis sınıfını oluşturabilmek için Organization Service
Proxy'nin bir instance'ını oluşturmamız gerekmekte. Daha sonrasında ise
Organization Servis sınıfını bunu göre ayarlayacağız.
Uri organizationUri = new Uri("https://
!organizasyon crm url! /XRMServices/2011/Organization.svc");
ClientCredentials
clientcred = new ClientCredentials();
clientcred.UserName.UserName = " kulllanici adi ";
cientcred.UserName.Password = " sifre ";
OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(organizationUri, null,
clientcred, null);
IOrganizationService _service = (IOrganizationService)_serviceproxy;Yukarıdaki kodun çalışabilmesi için
System.ServiceModel.Description, Microsoft.Xrm.Sdk ve Microsoft.Xrm.Sdk.Proxy
dll'lerinin referanslara eklenmiş olduğundan emin olun. Ayrıca uygulamayı .Net
Framework 4.5.2'de derlemek gerekiyor. Oluşturduğumuz bu servisi daha sonra
programımızın ilerleyen bölümlerinde çağırıp işlemler yapacağız.
Tabi burada
belirtilmesi gereken bir konu da işlem yapmak istediğiniz nesnenin üzerinde
yetkilerinizin olmasıdır. Bir kayıt oluşturabilmek için oluşturma yetkisine
sahip olmanız gerekmektedir. Sadece okuma yetkisiyle bir kayıt
oluşturamazsınız. Bir sonraki yazımda sizlere entity mimarisi ve yazma okuma
işlemlerini anlatacağım.
Yukaridaki
kod orneginde biz bir kullanici adi ve sifre ekledik. Eger her kullanicinin
kendi kullanici haklariyla sistem üzerinde işlem yapmasini istiyorsaniz
yukarıdaki kodda kullanici adi ve sifre kodunu silip asagidaki kodu eklemeniz
gerekir.
ClientCredentials clientcred = new ClientCredentials();
Boylece
sistemde oturum acmis kullanici bilgileri ile devam etmis olacagiz.
Bilmemiz
gereken diğer bir konu da eger Early Bind veri tipi kullanacaksak servisi
oluştururken ek bir komut daha girmemiz gerekmektedir. Yani linq ile sorgulama
ve generated code üzerinde işlemler yapabilmek icin oluşturduğunuz servis
nesnesine bu sekilde işlem yapacaginizi belirtmeniz lazim iste bunun icin
asagidaki satiri eklememiz gerekmekte.
_serviceproxy.EnableProxyTypes();
Bu arada CRM
servisi olusturmanin yeni bir yöntemi daha bulunmakta. Bu da CrmConnection
nesnesini kullanmak. Bu nesneye erişebilmek icin Microsoft.Xrm.Client dll’ini
referans olarak eklemeniz gerekmekte.
CrmConnection
crmConnection = CrmConnection.Parse("Url=https://!
Crm organizasyon url !/XRMServices/2011/Organization.svc; Username= kullanici
adi; Password= sifre");
OrganizationService service = new OrganizationService(crmConnection);
Boylece servis
oluşturma işlemini 2 satirda da halledebilmekteyiz. Tabii bu bilgileri ben bu
sekilde kod içerisine koymus gibi oldum size gostemek icin ama projelerde tabii
ki bunlari ya app.config, web.config içerisine ya da belli bir lokasyonda tuttuğumuz
xml dosyasi içerisinde tutuyoruz ki bu bilgiler degistiginde sürekli kod
degisikligi yapmak zorunda kalmayalım.