• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 23.04.2016 00:55:33C programlama 2 oyun
  • 20.04.2016 16:34:41Local Database
  • 15.04.2016 14:26:15Fatura kayıt işlemi
  • 21.03.2016 01:55:30C# problem

Popüler Sorular

  • 27.05.2012 05:49:50Asp.Net ile Date time alana veri ekleyemiiyorum ?
  • 2.04.2012 00:45:18.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 12.05.2012 08:44:49Acil Yardım
  • 27.05.2012 13:46:51veri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LINQ
  • LibreOffice
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

Workflow Foundation 4.0 - Declarative Validation [Beta 2]

Sakin bir Cuma gününde bilgisayarın başında kahvemi yudumlarken ve M&M drajelerinden avuç avuç yerken araştırmalarıma devam ediyordum. Bir süredir Workflow Foundation 4.0 ile birlikte gelen yenilikleri incelediğimden takip ettiğim bloglar ve MSDN üzerinde bu konu ile ilişkili yazıları okumaktaydım.

01.01.2013

Yazar: Burak Selim Şenyurt (Google+)

Kategori: C#.Net

3244

Merhaba Arkadaşlar,

Sakin bir Cuma gününde bilgisayarın başında kahvemi yudumlarken ve M&M drajelerinden avuç avuç yerken araştırmalarıma devam ediyordum. Bir süredir Workflow Foundation 4.0 ile birlikte gelen yenilikleri incelediğimden takip ettiğim bloglar ve MSDN üzerinde bu konu ile ilişkili yazıları okumaktaydım. Özelliklede son iki yazımda üzerinde durmaya çalıştığım özel aktivite bileşenlerinin doğrulanması konusunu irdelemekteydim. Bu yazımızda doğrulama(Validation) ile ilişkili araştırmalarımı sizlerle paylaşmaya devam ediyor olacağım.

Doğrulama işlemlerinin çeşitlerine baktığımızda Declarative Constraint isimli bir yaklaşımın daha olduğu görülmektedir. Bu yaklaşıma göre bir aktivite ile ilişkili doğrulama mantığının kısıt olaraktan(Constraint) ayrı bir tip ve metod içerisinde konuşlandırılması mümkündür. (Hatta kod dışında XAML bazlı olaraktan kısıtların konulmasıda söz konusudur) Workflow Foundation alt yapısında bu tip dekleratif doğrulamalar için Constraint sınıfından yararlanılmaktadır. Constraint  tipi aslında NativeActivity türevidir. Bir başka deyişle bir aktivitedir.

Yukarıdaki şekildende görülebileceği gibi Constraint abstract bir sınıftır(dolayısıyla kendisinden türeyen tiplerin mutlaka uyması gereken kuralları bildiren, örneklenemeyen ama kendisinden türeyen tip örneklerini taşıyabilen bir sınıftır) ve NaticeActivity tipinden türemektedir. Bu türetme nedeniyle aslında Workflow çalışma zamanının çeşitli materyallerine erişebildiğini(Scheduling, Bookmarks vb...) söyleyebiliriz. Peki pratikte kendi geliştireceğimiz aktivite bileşenleri için gerekli kısıtları nasıl koyabiliriz? MSDN üzerinde bu konu ile ilişkili olarak geliştirilen basit örnekte bir aktivite bileşeninin DisplayName özelliğinin 2 karakterden fazla olması gerekliliğinin örneklendiği görülmektedir. Bizde buna benzer bir kısıtlama geliştiriyor olacağız. Ancak örneğin farklı olması açısından, hayali yazılım şirketinin kod standartlarına göre DisplayName özelliğinin Chinook ön eki ile başlaması için bir kısıt getireceğiz. İşte Activity Library içerisinde tuttuğumuz örnek sınıf kodlarımız.

using System.Activities;
using System.Activities.Validation;

namespace CustomActivities
{
    public static class ActivityConstraints
    {
        // Constraint oluşturup geriye döndürecek basit bir static metod
        public static Constraint ValidateActivityDisplayNameForCompanyCodeStandards()
        {
            DelegateInArgument<Activity> element = new DelegateInArgument<Activity>();

            // Herhangibir Activity(T generic tipi olarak Activity kullanıldığından) bileşeninin doğrulanmasında kullanılacak olan Constraint tipi örneklenir.
            // Constraint tipi aslında NativeActivity türevli bir Activity bileşenidir.
            Constraint<Activity> constraint = new Constraint<Activity>
            {
                // Body kısmı doğrulama mantığını içermektedir ve ActivityAction tipindendir               
                Body = new ActivityAction<Activity, ValidationContext>
                {
                    Argument1 = element,                   
                    Handler = new AssertValidation
                    {
                        // Warning bilgisi gösterilmeyecektir. Yani Error mesajı verilecektir. IsWarning özelliğinin varsayılan değeri false' dur.
                        IsWarning=false,
                        // e, ActivityContext tipinden bir referanstır. Dolayısıyla Constraint' in uygulanacağı aktivite bileşeninin güncel içeriğine erişilebilmesi mümkündür.
                        // Örnek doğrulamaya göre Actitiy örneğinin DisplayName özelliğinin Chinnok kelimesi ile başlaması beklenmektedir.
                        Assertion=new InArgument<bool>(
                            e=>                               
                                element.Get(e).DisplayName.StartsWith("Chinook")
                            ),
                            // Eğer Chinook ismi ile başlanılmıyorsa bir hata mesajı verilir.
                        Message=new InArgument<string>("Şirketin kod standartları gereği, özel Activity adlarının Chinook ile başlaması gerekmektedir."),
                        DisplayName="DisplayNameValidationActivity"                        
                    }
                }
            };
            return constraint;
        }
    }
}

ActivityConstraints isimli static sınıf içerisinde yer alan ValidateActivityDisplayNameForCompanyCodeStandards isimli metod geriye Constraint tipinden bir referans döndürmektedir. Constraint tipinin üretimi sırasında dikkat edileceği üzere Handler özelliğine AssertValidation tipinden bir referans atanmaktadır. İşte bu sınıfın örneklenmesi sırasında kullanılan Assertion özelliği ilede bir Expression tanımlaması yapılmakta ve bu kısıtın uygulandığı Activity bileşeninin DisplayName özelliğinin Chinook ile başlayıp başlamadığı kontrol edilmektedir. Bu ifadeden dönecek değer göre Message özelliğine atanan bilginin derleme zamanında gösterilmesi sağlanmaktadir. IsWarning özelliği varsayılan olarak false değere sahiptir ve buna göre mesajın bir Error olarak gösterilmesi sağlanmaktadır. Ancak bu özelliğe true değerini atayaraktan Warning olarak gösterilmesi de sağlanabilir.  Peki bu kısıt bir aktivite bileşenine nasıl uygulanabilir? Aslında bunun için geliştiriken aktiviteye bir bildirimde bulunulması yeterlidir. Aşağıdaki kod parçasında yer alan aktivite bileşeninde bu durum ele alınmaktadır.

using System.Activities;
using System.Activities.Validation;

namespace CustomActivities
{
    public enum LogSource
    {
        File,
        Database,
        WebService,
        System
    }

    // Loglama yapan örnek bir aktivitedir.
    public sealed class LogActivity
        : CodeActivity<bool>
    {
        public InArgument<LogSource> LogSourceType { get; set; }

        public LogActivity()
        {
            // Constraint' lerin bir aktivite ile ilişkilendirilebilmesi için base referans üzerinden ilgili koleksiyona eklenmesi gerekmektedir.
            // Constraints özelliği bir koleksiyonu referans ettiği için bir aktiviteye birden fazla Constraint yüklenmesi mümkündür.
            base.Constraints.Add(ActivityConstraints.ValidateActivityDisplayNameForCompanyCodeStandards());
        }

        protected override bool Execute(CodeActivityContext context)
        {
            //TODO@Burak: Gerçektende loglama işlemi yapılması için gerekli kodlar yazılmalı
            switch (LogSourceType.Get(context))
            {
                case LogSource.File:
                    break;
                case LogSource.Database:
                    break;
                case LogSource.WebService:
                    break;
                case LogSource.System:
                    break;
                default:
                    break;
            }

            return true;
        }
    }
}

Burada odaklanılması gereken tek bir yer vardır...Yapıcı metodun(Constructor) içerisinde yer alan kod satırı. Dikkat edileceği üzere Constraints özelliği üzerinden ValidateActivityDisplayNameForCompanyCodeStandards  metodunun dönüş referansının ilgili koleksiyona eklenmesi sağlanmaktadır. Buna göre, LogActivity bileşeninin Visual Studio ortamında kullanıldığı durumlarda DisplayName özelliğinin ilgili kısıta göre kontrol edileceği bildirilmiş olmaktadır. Dilerseniz birde bileşeni test edelim. İşte bileşeni örnek bir Workflow üzerine ilk kez sürükleyip bıraktığımızdaki durum;

Görüldüğü üzere DisplayName özelliği için bir hata mesajı alınmıştır. Buna göre Chinook ön ekin kullandığımızda sorunun ortadan kalktığı görülebilir.

Constraint kullanımı dikkat edileceği üzere herhangibir aktivite bileşeni için kısıt koyabilmeyi olanaklı hale getirmektedir. Constraint kullanımında farklı durumlarda söz konusudur. Örneğin bir aktivitenin içerisinde yer alan tüm alt aktiviteler için geçerli olacak kısıtların konulmasıda mümkün olabilir. Bu son derece doğaldır nitekim Constraint sınıfı örneklenirken, ilişkilendirildiği aktivite içeriğine erişebilmektedir. Burada DelegateInArgument<Activity> temsilci tipinin büyük rolü vardır. Öyleki Expression tanımlamasının yapıldığı ve doğrulama mantığının gerçekleştirildiği yerde, güncel aktivite referansına ulaşmak için element.Get(e) söz dizimi kullanılmaktadır. Tabiki bu yazımızda Declarative Constraint kullanımını çok basit seviyede ele almaya çalıştık. En güncel ve detaylı bilgiyi elbetteki MSDN üzerinde bulabilirsiniz. Böylece geldik bir yazımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

DeclerativeConstraints.rar (50,29 kb)

Yazar Hakkında

Burak Selim Şenyurt

Burak Selim Şenyurt

buraksenyurt.com

Yıldız Teknik Üniversitesi Matematik Mühendisliği mezunu olan Şenyurt, 1999 yılında profesyonel olarak adım attığı yazılım dünyasında, 2003 yılından beri Microsoft .Net teknolojileri ile ilgilenmektedir. Yazılım hayatına Assist Line isimli Call Center firmasında Delphi programcısı olarak başlayan Şenyurt sonrasında, sırasıyla Bizitek(Junior Developer), Netron(Master Trainer), Citibank(Outsource Senior Software Developer), Innova(Application Development Consultant), ve TCM(Software Architect) firmalarında görev almıştır. Su anda ING Bank bünyesinde Kıdemli Yazılım Danışmanı olarak görev yapmaktadir. 2006, 2007 yıllarında C#, 2008,2009,2010 yıllarında ise Connected System Developer kategorisinde Microsoft MVP seçilen Şenyurt, evli ve 1 çocuk babasıdır. C# diline olan düşkünlüğü, oğluna S(h)arp adının verilmesinde önemli bir etken olmustur.

Sosyal Medya

ORANLAR

  • 3244izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Hocam Link başka sayfaya yönlendiriyor.
  • merhaba benim merak ettiğim bir konu var y...
  • Merhaba download linki çalışmıyor. Rica et...
  • Nevzat Bey selamlar, Açıkçası bizler a...
  • Parametreleri Cache İşleminden Yalıtma kon...

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 120172
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 65293
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 48406
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ