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.
Elinize sağlık gerçekten yararlı bir makale olmuş:)
YanıtlaSil