Bugünkü makalemizde Microsoft Dynamics Crm 2011 içerisindeki bir entity'e pre plug-in yazmasını öğreneceğiz. Plug-in mimarisini Microsoft Dynamics Crm 4.0 mimarisinden bildiginiz gibi iki çeşiti vardır. ( Pre Plugin ve Post Plugin )
İsterseniz ilk önce pre plugin ile post plugin arasındaki farkları anlatalım.
Pre-Plugin : Kayıt içerisinde kayıt edilmeden hemen önce çalışan yapıdır. Bu yapıda biz ilgili kayıt henuz kayıt edilmeden istersek gerekli kontrollerimizi yapar ve kaydı engelleriz istersek kayıt henuz kayıt edilmeden önce ilgili kayıt üzerinde bazı değerler ekleyebilir veya çıkartabiliriz.
Post Plugin : Kayıt içerisinde kayıt edildikten sonra çalışan yapıdır. Post pluginler ile yapabiliceklerimiz örnek olarak bir kayıt oluştuktan sonra bir başka entity de farklı bir kayıt oluşturmak olabilir.
Biz makalemizde pre plugin yapısını inceleyeceğiz.
Seneryomuzda kişi kartı üzerinde çalışan bir pre plugin yapımızın olduğunu varsayalım. Microsoft Dynamics Crm 2011 sisteminde bir kişi eklendiği zaman ilgili kişiye bir kişi seri numarası atayalım.
- İlk önce kişi kartı üzerinde kişi seri numarası adında bir field oluşturalım . new_kisiserinumarasi.
- Visual Studio 2010 üzerinde yeni bir class library projesi açalım.
Class ımızın adına KisiSeriUpdate adını verdim. Plug-in işlemlerimizi gerçekleştirmek için ihtiyacımız olan referansları ve dll leri sırası ile ekleyelim.
microsoft.xrm.sdk.dll
Microsoft.Crm.Sdk.Proxy.dll
Yukarıdaki ilgili dll leri Crm server ımızın kurulu olduğu makina üzerinde bin klasörünün altında bulabilirsiniz.
System.Runtime.Serialization referansımızıda projemize ekleyelim.
Uygulamamız içerisindeki referanslarımız aşağıdaki şekilde olmalıdır.
Kod yazımına başlamadan önce projemize son olarak bir key file ekleyelim. bunun için gerekli olan adımlar aşağıdaki gibidir.
- Projemiz üzerinde sağ tuş özellikler ekranına ulaşalım . Karşımıza aşağıdaki gibi bir ekran gelecektir.
Dikkat etmemiz gereken noktalardan biri uygulamamızın .net framework 4.0 olmasıdır.
Signing kısmından yeni bir key file ekleyelim.
Yukarıdaki adımlarımızı tamamladıktan sonra artık plugin yazma işlemlerimize başlayabiliriz.
using Microsoft.Xrm.Sdk;
namespace PrePlugin
{
public class KisiSeriUpdate:IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
throw new NotImplementedException();
}
}
}
Uygulama içerisinde oluşturduğumuz KisiSeriUpdate class ımıza IPlugin interface ini implement edelim. IPlug in interface i Microsoft.Xrm.Sdk içerisinde bulunmaktadır.
İnterface imizi implement ettikten sonra Execute method unun geldiğini göreceksiniz. Plugin işleyişi Execute metot'u içerisinde olur. Şimdi Execute method u içerisinde ilgili işlemlerimizi yapalım.
public void Execute(IServiceProvider serviceProvider)
{
try
{
// Plug-in imizi yakalamak için serviceprovider nesnesi üzerinden gelen asagıdaki adımlarımızı tamamlayalm.
Asagıdaki kod blogunda plug-in imizi çalıstırmak için gerekli olan servislerimizi ve ilgili servisi çalıstırmamız için gerekli olan kullanıcımızı
yakalamaktayız. ( Plug-in imizi hangi kullanıcı çalıstırdıgı ise o kullanıcının bilgileri bize context.UserId degeri ile birlikte gelecektir.
Dolayısı ile islemlerimiz de ilgili kullanıcının yetkisi dahilinde olacaktır.
Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
// if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) context nesnesinin içerisindeki
parmetrelerde Target parametresini olup olmadıgına ve ilgili parametrenin entity olup olmadıgına bakalım.
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
// Son olarak kendi olusturmus oldugumuz entity nesnesi içerisine yukarıda kontrol ettigimiz context nesneinin
Target input parametresini verelim.
Entity entity = (Entity)context.InputParameters["Target"];
// entity nesnesi içerisinde bizim kisi kartı üzerinde girdigimiz degerler bulunmaktadır.
}
}
catch (Exception ex)
{
// Plug-in içerisinde herhangi bir hata ile karsılasır isek bunu kullanıcıya mesaj olarak çıkartalım.
throw new InvalidPluginExecutionException("Genel Hata : " + ex.Message);
}
}
Yukarıda yapmış olduğumuz işlemler aslında bir plug-in yazımı aşamasındaki kalıp işlerimizdir. Servis ayarlarımızı aldık servise hangi kullanıcı ile baglanıcağımızın bilgilerini aldık . Kişi kartı içerisinde kullanıcının girdiği değerleri yakaladık.
Şimdi kişi kartı içerisine kisi seri numarası alanına değerimizi yazalım.
entity.Attributes.Add("new_kisiserinumarasi", 123456);
entity nesnesi içerisindeki Attributes listesine Add method u ile yeni bir değer ekleyelim. Eklemek istediğimiz field ın sistemsel adını verelim. new_kisiserinumarasi , field değerini belirttikten sonra ilgili alana değerimizi yazalım ben burda 123456 değerlerini yazdım bu değerler istenirse bir xml dosyasından da çekilebilir.
Plug-in işlemlerimiz bitmiştir. Şimdi uygulamamızı derleyelim ve dll çıktımızı alalım.
PrePlugin.dll dosyamızı Crm server ımıza plugin registration tool ile yukleyip test edebiliriz.