Asp.Net Core MVC Custom Controller Oluşturma
İlk olarak Controller sınıflarının özelliklerinden bahsetmek gerekirse HTTP isteklerine cevap vermeyi sağlayan, kullanıcıya bir etkileşim ekranı -Action- sunmaya aracılık yapan sınıflardır.
Controller sınıflarını tanımlamanın bir kaç yolu vardır:
1- ControllerBase Sınıfından katılmış bir class ile tanımlanabilir.
public class UserController : ControllerBase{}
2- Controller Son Eki(Suffix) Alacak Şekilde İsimlendirilmiş bir class tanımlamak
public class UserController {}
3- Tanımlanan bir class’ı [Controller] attribute ile işaretlemek.
[Controller]
public class User{}
Not: Burada aynı mantıkla bir controller’ın eğer controller özelliklerine erişilmesini istemiyorsak [NonController] attribute ile işaretleriz. Böylece o controller’a HTTP istekleri ile erişemeyiz.
Bu durumu geçici olarak kapatmak istediğimiz bir controller için kullanabiliriz.
4- Bu yazının asıl konusu bu yöntemi örnekleyebilmek. Aslında bu yöntem 2. bahsettiğimiz yönteme benzer. Diyelim sonu belirlediğimiz(suffix) bir şekilde biten classları da controller olarak atayabiliriz.
Bu yöntemi kullanabilmek için bir class oluşturuyoruz:
Oluşturduğumuz class ControllerFeatureProvider sınıfından türetiyoruz. Türettiğimiz sınıfın bizim için önemli metodu IsController(). Bu metodu override edip istediğimiz şekilde düzenliyoruz. Yukarıdaki kod ile birlikte hem önceki yöntemler gibi Controller’lar tanımlayabilir buna ek olarak da sonu “Denetleyici” ile biten classları Controller olarak tanımlayabiliyoruz.
Tabiki bu class tanımlamak bir işimize yaramıyacak bu class’ı bir yerden çağırmamız gerekecek ki burası Startup.cs:
services.AddMvc().ConfigureApplicationPartManager(op => { op.FeatureProviders.Add(new CustomControllerFeatureProvider()); });
Şimdi bu şekilde bir Controller tanımlayalım:
public class KullaniciDenetleyici
{
public string Get()
{
return “Test”;
}
}
Bu şekilde tanımladığımızda Controller çalışacaktır ancak …/KullaniciDenetleyici/Get şekilde erişebiliyoruz. Yani son ekin atılmış haline erişemeyiz. …/Kullanici/Get şekilde erişilmez.(Bunun için bir düzenleme yapmak gerekiyor. En kısa zamanda test edip eklemeye çalışacağım :) )