İlginizi Çekebilir
  1. Ana Sayfa
  2. Dynamics CRM
  3. Dynamics CRM 2015 Kodlama Mimarisi – Bölüm 7 – Hadi Plug-in Yazalım

Dynamics CRM 2015 Kodlama Mimarisi – Bölüm 7 – Hadi Plug-in Yazalım

Plug-in’ler hakkında temel bilgileri öğrendiğimize göre artık plug-in yazabiliriz. Aşağıda vereceğim örneklerde bir plug-in içerisinde yapabileceğiniz temel işlemleri anlatmaya çalışacağım. Bu kodlara CRM SDK\SampleCode\CS\Plug-ins içerisinden ulaşabilirsiniz.

Veritabanina Gitmeden Kayıtları Değiştirmek

Daha önce de ifade ettiğim gibi CRM içerisinde bir kayıt veritabanına gitmeden Pre-Operation(Pre-Event) adımında kaydettiğiniz bir plug-in ile kullanıcının oluşturmak istediği kayda ulaşabilirsiniz.


Resim-1

Aşağıdaki kod oluşturulan bir account(firma) nesnesinin içerisine eğer yok ise bir numara oluşturarak bunu accountnumber(müşteri numarasi) alanına vermekte böylece kayıtta olmayan bir alan veritabanina bu alan eklenmiş bir şekilde gidecek.

Kodda da görebileceğiniz üzere ilk önce Execute metodumuzu oluşturuyoruz. Biliyorsunuz ki bu metod parametre olarak içine aldığı ServiceProvider ile bize ihtiyacımız olan bütün verileri sunacak.

İlk önce Context’i ServiceProvider’dan türetiyoruz. Daha sonra da Context içerisindeki Target’in bir Entity mi olup olmadığına bakıyoruz. Tam bu noktada gelin Context nesnesinin içerisine bir bakalım.

Aşağıdaki ekran görüntüsünü bu plug-in’i debug ettiğim anda aldım. İlerleyen bölümlerde bir plug-in’in nasıl debug edileceğini anlatacağım. Şimdilik Context’e odaklanalım.

Görebileceğiniz üzere Context UserId, BusinessUnitId, MessageName, PrimaryEntityName, CreatedOn gibi o anda isimize yarayacak birçok veri yığınını içermekte. İşte Plug-in içerisinde ihtiyacımız olanları buradan alıp kullanacağız.


Resim-2

Entity ise onu entity sınıfından bir nesne haline getiriyoruz.

Bu sefer bu oluşturduğumuz yeni entity nesnesi account türünden bir nesne midir diye bakıyoruz.

Daha sonra içinde accountnumber diye bir alan var mi diye bakıyoruz. Yoksa iste tam bu noktada veritabanına doğru yolculuğa çıkmış olan kullanıcının bu kaydına müdahale edip içerisine bizim ürettiğimiz numara ile accountnumber nesnesini doldurarak entity mize veriyoruz. Artık içerisinde accountnumber alanı da var.

        /// <summary>

/// A plug-in that auto generates an account number when an

/// account is created.

        /// </summary>

/// <remarks>Register this plug-in on the Create message, account entity,

/// and pre-operation stage.

/// </remarks>

//<snippetAccountNumberPlugin2>

public void Execute(IServiceProvider serviceProvider)

        {

// Obtain the execution context from the service provider.

Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)

serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

// The InputParameters collection contains all the data passed in the message request.

            if (context.InputParameters.Contains(“Target”) &&

                context.InputParameters[“Target”] is Entity)

{

// Obtain the target entity from the input parameters.

                Entity entity = (Entity)context.InputParameters[“Target”];

//</snippetAccountNumberPlugin2>

// Verify that the target entity represents an account.

// If not, this plug-in was not registered correctly.

if (entity.LogicalName == “account”)

{

// An accountnumber attribute should not already exist because

// it is system generated.

                    if (entity.Attributes.Contains(“accountnumber”) == false)

                    {

// Create a new accountnumber attribute, set its value, and add

// the attribute to the entity’s attribute collection.

                        Random rndgen = new Random();

entity.Attributes.Add(“accountnumber”, rndgen.Next().ToString());

                    }

                    else

                    {

                        // Throw an error, because account numbers must be system generated.

// Throwing an InvalidPluginExecutionException will cause the error message

// to be displayed in a dialog of the Web application.

throw new InvalidPluginExecutionException(“The account number can only be set by the system.”);

                    }

                }

            }

        }

Umarım birşey dikkatinizi çekmiştir. Entity içerisine direkt alani Attributes.Add metodu ile ekliyoruz. Yani bir update işlemi yapmıyoruz zaten kayıt daha veritabanina gitmedi doğal olarak CRM Service nesnesinin bir instance’ini oluşturmamıza da gerek kalmadı.

Update Anında Update Edilmemiş Değerlere Ulaşmak

Başlık biraz karışık gelebilir ama aslında tam olarak da durum bu update anında update edilmemiş alanlara ulaşmak istiyorsanız birazdan bahsedeceğim yöntemi uygulamanız gerekmekte. Peki biz neye neden ulaşamıyoruz diye soracak olursanız açıklayayım. Dynamics CRM’in Create anında kayıt ile ilgili elde ettiği bütün bilgileri bize Target’tan türettiğimiz entity içerisinde verir. Aşağıdaki ekran görüntüsünde de bu durumu görebilirsiniz.


Resim-3

Update anında durum bundan farklı sistem bize sadece (doğal olarak) update edilmiş alanları vermektedir. Aşağıdaki ekran görüntüsüne bakabilirsiniz.


Resim-4

Ben bu contact üzerinde sadece jobtitle alanını güncelledim. Sistem jobtitle ve yanında ihtiyaç duyulacak birkaç bilgiyi daha Target’a vermekte o kadar.

Simdi konu başlığına dönecek olursak iste tam bu update anında ben update edilmemiş bir alanın değerine ulaşmak istersem ne yaparım? Sistemde bunun için Image yani o kaydın o anki snapshot’ini almamızı sağlayan bir özellik var.

Herhangi bir plug-in step’i üzerinde sağ tuşa basarak “Create new image” seçeneğini seçtiğimizde aşağıdaki ekran karşımıza gelecektir.


Resim-5

Bu ekranda Pre ve Post olarak istediğimiz alanları parametre olarak seçebilir ve bunlara genel bir isim verebiliriz. Ben Target dedim.

İşte bu ayarlamayı yaptığınızda aşağıdaki ekran görüntüsündeki gibi update anında değişmeyen ama sizin erişmek istediğiniz alan/alanlar PreEntityImages içerisinde hazır olacaktır.


Resim-6

Hangi Message’da hangi image’lara ulaşabileceğinizin listesi aşağıdaki gibidir.


Resim-7

Peki kod tarafında buna nasıl ulaşacağız derseniz o da şu şekilde olacak;

Önce image nesnesine ulaşıyoruz:

Entity image = (Entity)context.PreEntityImages[“Target”];

Sonra image içerisinden istediğimiz alana erişiyoruz:

String descriptionMessage = “Old full name: ” + image[“fullname”];

Üzerinde çalıştığım nesnenin ID’si nerede?

Update edilmiş ya da post-operation durumdaki bir nesnenin ID’sine ihtiyaç duyarsanız su şekilde elde edebilirsiniz:

Guid id = new Guid(context.OutputParameters[“id”].ToString());

Ya da

Guid id = context.PrimaryEntityId;

Plug-in’ler Arasında Bilgi Paylaşımı

Eğer bir plug-in içinde oluşturduğumuz bir veriyi diğer plug-in’lerin de erişmesini istiyorsak “SharedVariables” yapısını kullanmamız gerekmekte. SharedVarabiles aslında bir parametre koleksiyonu ve içerisinde paylaşmak istediğiniz nesneleri saklayabilirsiniz.

Aşağıda 2 tane plug-in yer almakta. ilk plug-in (PreEventPlugin)

context.SharedVariables.Add(“PrimaryContact”, (Object)contact.ToString());

Kodu ile Contact isimli Guid nesnesini “PrimaryContact” adında SharedVariables içerisinde saklamakta.

İkinci plug-in ise Post-event anında çalışmakta ve SharedVariables’den istediği değeri örnekteki gibi almaktadır.

Böylece plug-inler arası veri transferi ve yapılmış olmakta.

Guid contact =

new Guid((string)context.SharedVariables[“PrimaryContact”]);

public class PreEventPlugin : IPlugin

{

public void Execute(IServiceProvider serviceProvider)

{

// Obtain the execution context from the service provider.

Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)

serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

// Create or retrieve some data that will be needed by the post event

// plug-in. You could run a query, create an entity, or perform a calculation.

//In this sample, the data to be passed to the post plug-in is

// represented by a GUID.

Guid contact = new Guid(“{74882D5C-381A-4863-A5B9-B8604615C2D0}”);

// Pass the data to the post event plug-in in an execution context shared

// variable named PrimaryContact.

context.SharedVariables.Add(“PrimaryContact”, (Object)contact.ToString());

}

}

public class PostEventPlugin : IPlugin

{

public void Execute(IServiceProvider serviceProvider)

{

// Obtain the execution context from the service provider.

Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)

serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

// Obtain the contact from the execution context shared variables.

if (context.SharedVariables.Contains(“PrimaryContact”))

{

Guid contact =

new Guid((string)context.SharedVariables[“PrimaryContact”]);

// Do something with the contact.

}

}

}

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar

https://www.mshowto.org

Yorum Yap

Yazar Hakkında

Barış Kanlıca firmalara CRM ve yazılım konusunda danışmanlık yapmaktadır ve yazılım eğitimleri vermektedir. Dynamics CRM alanında yaptığı çalışmalarından dolayı Microsoft kendisine bu alanda sadece 55 kişide olan MVP(Most Valuable Professional) unvanını ve ödülünü vermiştir. Barış Kanlıca birçok üniversite ve seminerde konuşmacı olmaktadır. Kendisi INETA topluluğunun bir konuşmacısıdır. Ayrıca www.yazgelistir.com, www.yazilimgunlugu.com ve www.nedirtv.com sitelerinde bölüm editörüdür.Uzunca bir süredir Londra'da yaşayan Barış Kanlıca ve kurucusu olduğu Mawens Business Solution'da danışmanlık hizmeti vermeye devam etmektedir.

Yorum Yap