asp.net mvc, denetleyicileri ayrı bir projeye yerleştirir


107

Sadece asp.net mvc'yi öğreniyorum ve denetleyicilerimi ayrı bir projeye nasıl taşıyacağımı bulmaya çalışıyorum. Tipik olarak daha önce asp.net web uygulamaları tasarladığımda, modellerim için bir proje, mantığım için başka bir proje oluşturdum ve sonra web vardı.

Şimdi asp.net mvc'yi öğrendiğime göre, benzer bir model izlemeyi ve modelleri ve denetleyicileri kendi ayrı projelerine koymayı ve görünümleri / komut dosyalarını / css'yi web'de bırakmayı umuyordum. Modeller kısmı kolaydı, ama anlamadığım şey, kontrolörlerimin ayrı bir projede nasıl "bulunmasını" sağlayacağım. Ayrıca bunun tavsiye edilip edilmediğini bilmek istiyorum. Teşekkürler!

Yanıtlar:


92

Öncelikle modelinizi ayrı bir projeye yerleştirmek kesinlikle iyi bir fikirdir. Keşfettiğin gibi, bu önemsiz.

Denetleyiciler ve Görünümler ile ilgili olarak, belirli bir uygulamada bunu yapmak için özel bir ihtiyacınız olsa da, çoğu temel proje için onları ayırmanın bariz bir avantajı görmüyorum.

Bunu yapmayı seçerseniz, çerçeveye denetleyicilerinizi nasıl bulacağınızı söylemeniz gerekecektir. Bunu yapmanın temel yolu, kendi ControllerFactory'nizi sağlamaktır. Bunun nasıl yapıldığına dair bir fikir edinmek için DefaultControllerFactory'nin kaynak koduna göz atabilirsiniz. Bu sınıfın alt tipini oluşturmak ve GetControllerType (string controllerName) yöntemini geçersiz kılmak, istediğiniz şeyi gerçekleştirmek için yeterli olabilir.

Kendi özel ControllerFactory'nizi oluşturduktan sonra, çerçeveye nerede bulacağını söylemek için global.asax içindeki Application_Start'a aşağıdaki satırı ekleyin:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

Güncelleme: Daha fazla bilgi için bu gönderiyi ve bağlandığı gönderileri okuyun . Ayrıca Phil Haack'ın şu konu hakkındaki yorumuna bakın:

ControllerBuilder.Current.DefaultNamespaces.Add(
    "ExternalAssembly.Controllers");

... bu tam bir çözüm değil, ancak basit durumlar için muhtemelen yeterince iyi.


2
Teşekkürler Craig! Bu tam olarak aradığım şey. Bu bilgiler internette bile var mı? Şansım yaver gitmeden, her yerde Google'da araştırdım. StackOverflow tekrar geliyor!
Aaron Palmer

11
Kabul ediyorum, denetleyiciler kullanıcı girdisini yönetiyor, modeli yönetiyor ve ardından verileri görünüme aktarıyor. Genellikle bir uygulamaya çok özeldirler. Uygulamaya özgü olmayan herhangi bir mantık, bir kitaplıkta veya modelde daha iyi durumda olabilir. Ancak genel olarak kontrolörler web projesinde yer almalıdır.
Haacked

2
İki uygulama arasında aynı olan bir hata denetleyicim ve görünümlerim var. Bunların her iki uygulamanın da kullanabileceği tek bir montajda olması bana mantıklı geliyor.
Yelken Judo

3
Kontrolörler ayrı bir
projedeyken

1
@Chev, orada bir fark yaratacağını düşünmüyorum. Denetleyicilerinizin test edilebilirliği, nerede yaşadıklarıyla değil, onları nasıl kodladığınızla ilgilidir .
Craig Stuntz

19

Kendi ControllerFactory'nizi oluşturmanız mantıklı olsa da, her projede tüm Denetleyicilerimi tanımlamayı daha uygun buldum, ancak bunları Paylaşılan projemdeki Denetleyicilerden türetmeyi daha uygun buldum:

namespace MyProject1.Controllers
{
   public class MyController : MySharedProject.Controllers.MyController
   {
      // nothing much to do here...
   }
}

namespace MySharedProject.Controllers
{
   public abstract class MyController : System.Web.Mvc.Controller
   {
      // all (or most) of my controller logic here...
   }
}

Bu, projeden projeye farklılık gösteren Denetleyici mantığınızı koyabileceğiniz bir yere sahip olmanızın ek yararıdır. Ayrıca, diğer geliştiricilerin Denetleyici mantığınızı hızlı bir şekilde bulması daha kolaydır çünkü Denetleyiciler standart yerde mevcuttur.

Bunun tavsiye edilebilir olup olmadığına gelince, kesinlikle öyle olduğunu düşünüyorum. Aksi halde çok farklı iş mantığına sahip projeler arasında paylaşmak istediğim bazı ortak Hesap Yönetimi mantığı oluşturdum. Bu yüzden Hesabımı ve Yönetici Denetleyicilerimi paylaşıyorum, ancak diğer Denetleyiciler kendi projelerine özeldir.


1
Bu çok iyi çalıştı, ancak bir yönlendirme hatasını önlemek için bazı gereksiz kodları ortadan kaldırmak zorunda kaldım
Ken Mc

Merhaba, Bu tür bir projede yönlendirmeyi nasıl yönetebilirim? öznitelik yönlendirmesini kullanmak istiyorum ...
محمد

Normalde yapacağınız gibi öznitelik yönlendirmesini kullanabilirsiniz.
ThisGuy

2
Bunun neden daha fazla olumlu oyu olmadığından emin değilim ... kabul edilen cevaptan çok daha zarif, sanırım. Teşekkürler!
jleach

Bu benim için çalışmıyor. Bunun .Net Core mu yoksa .Net Framework olduğunu söyleyebilir misiniz?
Homayoun Behzadian

4
  • Mvc projeniz için Sınıf Kitaplığı ekleyin.
  • Sınıfta aşağıdaki kodu ekleyin (u'r Denetleyici Kodu için)

    namespace ContactController
    {
    public class ContactController : Controller
    {
        public ActionResult Call()
        {
            ViewBag.Title = "Inside MyFirst Controller.";
            return View();
        }
    }

    }

  • Mvc proje görünümü klasöründe, Kişi klasörünü ekleyin ve bir Call.cshtml dosyası oluşturun. Dosya görüntüle

  • Sınıf kitaplığı proje referansını ana MVC projenize ekleyin.

Referans

  • Son olarak, iletişim denetleyicisi ad alanını Route Config'e yönlendirmek.

RouteConfig


3
Denetleyiciyle aynı ada sahip ad alanınızın olması biraz talihsiz bir durumdur.
Mariusz Jamro

3

System.Web.MvcNuGet referansını güncelledikten sonra sorunum çözüldü, böylece MvcWebsite ve Class Library aynı System.Web.Mvcsürümü kullanıyor

Varsayılan ad alanları eklemeye gerek yok


Sorun şu ki, mevcut mvc derlemesi, sınıf kitaplığının başvurulan mvc derlemesinden daha düşük bir sürüme sahipken MvcWebsite istisna oluşturmadı
Homayoun Behzadian

1

Kullandığım en basit ayırma biçimi, Görünümleri orijinal MVC projesinde "olduğu gibi" tutmak, ancak Denetleyicileri kaldırmaktır. Ardından yeni bir ClassLibrary projesinde Controller sınıflarını ekleyin ve Controller'dan devraldıklarından emin olun.

MVC yönlendirme motoru, ClassLibrary'deki Denetleyicilere otomatik olarak yönlendirir ve Denetleyiciler, referanslarınızı ve kullanımlarınızı doğru şekilde yerine getirmeniz koşuluyla, orijinal MVC projesinden Görünümleri otomatik olarak oluşturur.

Bu mimariyi, ana çözümden ayrı olarak derlenebilen ve dağıtılabilen bir Html Raporları modülünü uygulamak için kullanıyorum. Sonunda SSRS'den özgürüm!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.