Ana içeriğe atla

How to create and add plugins to an Asp.net MVC 5.0 Web Application. Asp.net MVC 5.0 web uygulamasına Plugin nasıl yazılır ve eklenir.

Bu yazımda, modular bir asp.net mvc 5 web uygulamasının nasıl yazılacağını kısaca anlatmaya çalışacağım.

Plugin nedir?

Plug-in, kendi başına çalışabilen bir program için, genellikle çok özel bir alanda duyulan gereklilik üzerine geliştirilen, programa yeni özellikler ekleyen yazılımdır. Plug-inler ana programdan bağımsız çalışamaz.
Uygulamalar çok çeşitli nedenlerden dolayı plug-inlere destek verirler. Bunlardan bazıları şöyledir:
·         Diğer yazılımcıların uygulamayı genişletmesine olanak sağlamak
·         Ana uygulamanın boyutunu küçültmek
·         Yazılım Lisansından doğacak problemleri önlemek için kaynak kodu uygulamadan ayırmak. [1]

Bir E-Ticaret uygulamasını düşünün, bu Uygulama ilk aşamada tek bir ödeme yöntemiyle (Teslim’de ödeme) geliştirilmiştir, daha sonra Paypal ödeme yöntemi eklemek istediğimizde bütün uygulamayı değiştirmek yerine sadece Paypal Ödeme plugin’ini uygulamaya eklediğimizde bu uygulamayı genişleterek yeni bir özellik katmış oluruz.
Asp.net MVC’de “Area” eklemek mümkün. Area Hakkında bilgi almak için Buraya Bakınız: https://msdn.microsoft.com/en-us/library/ee671793%28v=vs.100%29.aspx. Ancak “Area”lar Uygulamanın ana Dll dosyalarıyla birlikte derlenir, ve bu yüzden ne zaman sadece plugin’i değiştirmek isteseniz bile tüm uygulamayı tekrardan derlemeniz gerekmektedir. Ancak plugin’in tanımında da olduğu gibi kolaylıkla eklenip kaldırılmalıdır. Değişiklik ve güncelleme gerektiğinde de sadece Plugin’in projesini derlememiz yeterli olmalıdır.
Aşağıdaki Örnek projede bir Asp.net MVC 5 Uygulamasını nasıl modular yapabiliriz ve Admin Bölgesini ayrı bir proje olarak (plugin) ona ekleyeceğiz. Burada Admin yerine siz pluginlerinizi de aynı yöntemler ekleyebilirsiniz. Yazının sonunda pluginleri “Area” yerine başka bir klasör isminde (Örneğin: Plugins) tutabileceğiniz açıklanmıştır. Uygulamanın kaynak kodlarına Şurdan ulaşabilirsiniz.

   1-      Yeni bir Asp.net Mvc uygulaması Oluşturunuz.


   2-      Solution Explorer’de Proje adının üzerinde Sağ tıklayarak Addà Area... ‘yı tıklayınız. Böylece Projeye yeni bir “Area” Eklemiş olacaksınız.



Area Ekledikten sonra uygulamanızın Dosya Yapısı ‘Solution Explorer’da şu şekilde olacaktır. 


   3-      “Areas/Admin/” klasöründe “AdminAreaRegistration.cs” Dosyasını muhafıza ederek kalan bütün içeriklerini siliniz.


   4-      Admin (plugin) için yeni bir “asp.net mvc web application” projeyi “/Areas/” klasörünü seçerek ekleyiniz.



Plugini ekledikten sonra klasör yapınız şu şekilde görünecektir. daha önce Muhafiza ettiğiniz "AdminAreaRegistration.cs" dosyasını yeni eklenen projenin içine çekiniz.


   5-      Visual Studio her yeni eklenen web app ile birlikte bazı dosyalar ve işlevleri kolaylık olsun diye ekliyor, ancak biz bu projeyi plugin olarak kullanacağımız için bazı dosyalara ihtiyacımız yoktur, Örneğin: Uyelik kodları, global.asax vs.
Not: Eğer üyelik kodlarına ihtiyacınız yoksa, yeni proje eklenirken kimlik doğrulama yöntemini “No Authontication” olarak işaretleyebilirsiniz.
Silincek gereksiz klasör ve dosyalar aşağıdaki resimde gösterilmiştir.


    6-      Gereksiz klasör ve dosyaları sildikten sonra, web.config dosyasını biraz temizlemeniz gerekli. Web.config temizlendikten sonra aşağıdaki gibi olacaktır.


   7-      Sıra plugin’in derlendikten sonra ve uygulamanın ihtiyacı olduğunda dll dosyalarının nerede olacağını ayarlamaktadir. Bunun için yeni eklediğiniz plugin projesinin üzerinde sağ tıklayınız ve özelliklerini açınız. Bu sayfada “Build” tabinde “Output path:” özelliğini “..\..\bin\ olarak değiştiriniz.
Dikkat: burada amaç ana projenin /bin/ klasörünün adresini pluginin “derleme sonuçlarının kaydolacağı adres olarak belirlemektir, dolayısıyla projeniz dosya yapısı gereği “..\..\bin\” adresi değişiklik gösterebilir.
Not: Burada tam adres vermemeniz lazım, adres relative olması lazım, absolute değil. Örneğin: “c:/projects/example/bin” doğru değildir, proje plugine göre relative bir adres olamlıdır.



    8-      Sırada Route ayarlarını düzenlemek var, Özellikle de eğer her iki projede aynı ismi de “Controller” klaslar mevcut ise, kesinlikle route ayarlarında “namespace”leri belirtmeniz lazım.


1 AdminAreaRegistration.cs ayarları – plugin route ayarları


2 Ana Proje Route Ayarları

   9-      Son olarak admin projesinin ana sayfasında bir değişiklik yapalım ki, gerçekten plugini çalıştırdığımız anlaşılsın.




Aşağıdaki resimde Ana projenin /Home/Index’i ve Plugin’in /Home/Index sayfaları gösterilmiştir.



"Areas" ismi Yerine "Plugins" ismi kullanalım

Eğer areas klasörünü kullanmak istemiyorsanız, ve onun yerine pluginlerinizi plugins klasöründe tutmak istiyorsanız, sadece klasör ismini ve değiştirmeniz yeterli olmayacaktır, hatta route ayarlarını da değiştirseniz gene de asp.net view’larınızı bir türlü bulamayacaktır ve hatta sayfasını gösterecektır. Bu problemi çözmek için yapmanız gereken şey Yeni bir ViewEngine yazmak olacaktır.
Asp.net MVC’de varsayılan ViewEngine view’ları bulmak için “/Shared/”, ve “/{Controller}/” klasörlerini ve Area’lar içinde “/Areas//{Area}/Shared/”  ve “Areas/{Area}/{Controller}/” klasörlerini inceler. Sanırım ne yapmanız gerektiğini anladınız. Yapmanız gereken tek şey Varsayılan ViewEngine’i genişleterek “/Plugins/{Area}/Shared” ve “/Plugins/{Area}/{Controller}/” klasörlerinide ViewEngine’e aratmak olacaktır, daha sonra Asp.net MVC’ye viewları bulmak için varsayılan ViewEngine yerine benim yeni ViewEngine’imi kullan.
Şu Şekilde:

public class MyViewEngine : RazorViewEngine
    {
        public MyViewEngine()
        {
            AreaViewLocationFormats = new[]
            {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml",
                "~/Plugins/{2}/Views/{1}/{0}.cshtml",
                "~/Plugins/{2}/Views/{1}/{0}.vbhtml",
                "~/Plugins/{2}/Views/Shared/{0}.cshtml",
                "~/Plugins/{2}/Views/Shared/{0}.vbhtml"
            };
            AreaMasterLocationFormats = new[]
            {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml",
                "~/Plugins/{2}/Views/{1}/{0}.cshtml",
                "~/Plugins/{2}/Views/{1}/{0}.vbhtml",
                "~/Plugins/{2}/Views/Shared/{0}.cshtml",
                "~/Plugins/{2}/Views/Shared/{0}.vbhtml"
            };
            AreaPartialViewLocationFormats = new[]
            {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml",
                "~/Plugins/{2}/Views/{1}/{0}.cshtml",
                "~/Plugins/{2}/Views/{1}/{0}.vbhtml",
                "~/Plugins/{2}/Views/Shared/{0}.cshtml",
                "~/Plugins/{2}/Views/Shared/{0}.vbhtml"
            };
               
        }
    }

Yeni ViewEngine’i Asp.net MVC ile tanıştırmak için global.asax dosyasında, ApplicationStart fonksiyonuna bu kodları eklemeniz yeterli olacaktır.
// Removes the default engines and adds the new one.
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new PluggableWebApplication.MyViewEngine());

Ve Tamam.

Yorumlar

Yorum Gönder

Bu blogdaki popüler yayınlar

C# ve Asp.net MVC'de Çok katmanlı Soğan mimarisi (Onion Architecture)

Çok katmanlı mimari, güçlü ve kolay geliştirelebilen ve katmanlarının kolaylıkla değiştirilebilen büyük uygulamalarda çok önemli bir rol oynar. Eski ve en ünlü çok katmanlı mimari, 3 katmandan oluşmakta Data Access Layer - Veri Katmanı Business Process Layer - İş Modeli Katmanı Presentation Layer - Kullanıcı Arayüzü Katmanı  Bu mimaride, Kullanıcı Arayüzü Katmanı sadece ve sadece İş Modeli Katmanıyla iletişimdedir, ve Veri Katmanıyla direk iletişime geçmesine izin verilmiyor, böylece hem güvenlik sağlanıyor, hem de bir katman değiştirilmek istendiğinde diğer katmanlarda minimum değişiklikle bu işlem yapılabiliyor. bu mimari her ne kadar küçük ölçekli uygulamalarda başarılı olsa da, daha büyük ve karmaşık uygulamalarda yetersiz kalmaktadır. Geleneksel Katmanlı Mimari Onion Architecture veya Soğan mimarisi Jeffrey Palermo tarafından onerilmiştir. bu mimaride her katman soğan halkaları gibi düşünülmüş olup kolaylıkla değiştirilebilmesi veya düzenlenmesi amaçlanmıştır. bu mim

Güncel İl, İlçe ve Okullar Listesi (excel ve sql)

Bu Yazımda, en son ve güncel iller, ilçeler ve okullar listesini yayınlıyorum. bu yayında hem excel ve hemde sql sorgularını yayınlanmıştır. NOT1: il ve ilçeler listesi iç işleri bakanlığının sitesinden alınmıştır. eğer değişiklik olursa bu linkten kendiniz de alabilirsiniz, ancak veritabanına kendiniz yazmanız gerekecektir. İÇ İŞLERİ BAKANLIĞI - İL ve İLÇELER LİSTESİ NOT2: Okullar listesi Milli Eğitim Bakalığı sitesinden alınarak Excele aktarılmıştır, daha sonra Excelden Veritabanında eşleşen il ve ilçeri bulunarak doğru bir şekilde kaydedilmiştir. Toplam 3250 Adet okul. Milli Eğitim Bakanlığı - Okullar Ful Listesi Tablo düzeni şu şekildedir. İl, İlçe ve Okul için SQL İlişki diagramı Yukarıdaki Resimde görüldüğü üzere; Her İl'in (City Tablosu) 0 veya birden fazla İlçesi var, ve her İlçenin 0 veya daha Çok Okulu vardır. Gördüğünüz üzere Okul ve İl arasında bağlantı eklenmemiştir, okul olduğu il zaten ilçe tablosu vasitasiyla belirlenebiliniyor, böylece veri taba

C# ve Asp.net MVC'de Çok katmanlı Soğan mimarisinde (Onion Architecture) Asp.Net Identity Kullanımı

Bir önceki makelemde (Buraya Tıklayınız)   Soğan mimarisini oluşturduk ve Ninject kullarak Katmanlar arasında bağımsızlığı sağladık. Bu makalede ise ASP.NET Identity 2.x kullanarak Güvenlik ve Üye yönetimini katmanlı mimaride nasıl sağlayabileceğimizi göstereceğim. bu makalede amaç ASP.NET Identity hakkında bilgi vermek veya nasıl kullanıldığını anlatmaktan ziyade, bir katmanlı mimaride katmanlar arası ilişkiyi bozmadan ASP.NET Identity'yi kullanıma sunulmasıdır. Sorun Nedir? Yeni bir web uygulaması oluşturulduğunda ve üye yönetimi olarak ASP.NET Identity kullanıldığında varsayılan olarak veri tabanı erişimini doğrudan PL katmanından ayarlamaktadır, ancak katmanlı mimaride PL katmanın veri tabanına veyahut DAL katmanına doğrudan erişmesi yasaklanmıştır. ASP.NET Identity'nin çalışabilmesi için IdentityDbContext 'i geliştirmiş bir Context (Entity Framework) sınıfına ihtiyaç duyar. Önemli Not: ASP.NET Identity varsayılan olarak EF kullanarak veri tabanına erişim