2011-07-26 17 views
10

Uygulamamızda, belirli talepleri sitenin diğer bölümlerine yönlendirmek için yeni .NET 4 yönlendirme sistemini kullanıyoruz. Site kodumuzu yalnızca geç akşamlarda yayınlamaya izin verilir, bu da herhangi bir kod değişikliğini yayınlamak için işyerinde geç kalmamız gerektiği anlamına gelir. Eski içeriğe olan eski bağlantıları desteklemek ve bunları yeni içeriğe yönlendirmek için sık sık özel rotalar oluşturma ihtiyacımız vardır. Bunlara sıklıkla ihtiyaç duyulmaktadır ve rotalarımız derlenmiş global.asax'da tanımlandığından, bu canlılara hemen ihtiyaç duyduğumuzda ancak bir kod itme yapamadığımız zaman bir çıkmaza ulaşıyoruz..NET 4'te dinamik olarak yollar oluşturmak mümkün mü?

Bir çeşit yapılandırma dosyasında yolları tanımlamanın ve uygulamayı yeniden başlatmadan siteyi program aracılığıyla okuyabilmemizin bir yolu var mı?

+0

Soruyla doğrudan alakalı değil, sürekli entegrasyona sahip otomatik dağıtımları düşündünüz mü? Bunlar aile zamanına geri dönmenize yardımcı olabilir. – Jordan

+0

@Jordan Dağıtım geliştirmeleri için göz önünde bulundurduğumuz birçok şey var ama bunun üzerinde doğrudan kontrolüm yok. Canlı sunucuda hiçbir şey olmadığından emin olmak için serbest bıraktığımızda burada olmamız gerekiyor. TeamCity'de olmamızı ve otomatikleştirmemizi isterdim ama bu benim görüşmem değil. Bunların hiçbiri, otomatik olarak serbest bırakılıncaya kadar hala beklemek zorunda kaldıkları için, uçağa bir rota atmaya ihtiyaç duyma problemini çözmez. – Chev

cevap

1

Yapılandırma dosyasının değiştirilmesi, uygulamanın yeniden başlatılmasını gerektirdiğinden (ve her ne olursa olsun, yönlendirmeler yalnızca başlangıçta kaydedilmiş olsa bile), rota kaydının (başlangıç ​​için) neden olamadığını bir neden göremiyorum kütüphanede "sadece yönlendirme için" (Routes.dll)?

Otomatik bağımlılık enjeksiyon/servis kaydı ve rota kaydını destekleyen MVCTurbine kullanıyorum. Ben rota kayıt için böyle sınıfını kullanın:

public class RouteRegistrator : MvcTurbine.Routing.IRouteRegistrator 
    { 
     /// <summary> 
     /// Registers routes within <see cref="T:System.Web.Routing.RouteCollection"/> for the application. 
     /// </summary> 
     /// <param name="routes">The <see cref="T:System.Web.Routing.RouteCollection"/> from the <see cref="P:System.Web.Routing.RouteTable.Routes"/>.</param> 
     public void Register(System.Web.Routing.RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
       new string[] { "MyNamespace.Controllers" }); // Parameter defaults 
     } 
    } 

Bu sınıf webui projenin parçası olmak zorunda değildir, ancak ayrı dll olabilir. MVCTurbine, bin dizinindeki kütüphanelerde bulunan IRouteRegistrator ve IServiceRegistrator uygulamalarını otomatik olarak yükler (ve çağırır). Ve bildiğim gibi, IRouteRegistrator uygulamasının uygulama klasörüne uygulanmasında yeni yollar içeren dll ekleyerek yeni rotalar eklemenizi engelleyen hiçbir şey yoktur. Böylelikle, yeni uygulama yolları "anında", uygulama geri kalanını riske atmadan ekleyebilirsiniz (beklenmedik bir şey olursa yeni dll kolayca kaldırılabilir).

MVC Turbine kullanamıyorsanız veya kullanmıyorsanız, global.asax'tan dinamik olarak yüklenen kütüphaneye (yalnızca) sınıf içeren rotalar koleksiyonunu geçirerek rota kaydını harici dll'e "ayıklamak" için bu konsepti kullanabilirsiniz. rota kaydı için yöntemle.

Bu (MVCTurbine olsun veya olmasın) başlangıç ​​noktası olarak, gerekirse, ortak yollar için xml veya txt config dosyasını foreach döngüsüne kolayca okuyabilirsiniz, ancak bu yöntem zor olduğu için basit yollarla sınırlı olacaktır (karmaşık, ancak metinde daha karmaşık bir yol yapılandırmasını temsil etmek imkansız değildir.

+1

Evet "Yapılandırma dosyasında değişiklik yapılması uygulamanın yeniden başlatılmasını gerektirdiğinden" korkuyordum. Maalesef gün boyunca zorlayamayacağımızın nedeni, uygulamayı yeniden başlatmamızın mümkün olmaması. Bu bir iç sitedir ve çalışanlar işlerini yapmak için kullanırlar. Yeniden başlatılması çoğu kez onlara keder getirir. Cevabınız için teşekkür ederiz, rotalarımızı ayrı bir dll olarak derlemek yararlı olabilir. – Chev

+0

Mümkün olandan bile emin değilsiniz, ancak her istekte rota kaydı size büyük bir performans getirebilir. Peki, mvc kullanırsanız, oturum herhangi bir veri içermemeli ve çerez tabanlı kimlik doğrulamayı etkinleştirdiyseniz, küçük yeniden başlatma oldukça zararsız olmamalıdır? :) Her neyse, umarız "allstaff" e mail gönderebiliriz ki, sunucu yeniden başlatması saat x o saatte olacak, lütfen çalışmanızı kaydedin ... Yönetimin daha büyük acil durumun ne olduğuna karar vermesi gerektiğine inanıyorum - devam eden çalışmalar veya yeni yollar: S –

+0

Anlaşılan bu, kumda zor bir çizgidir ve uzlaşma için oldukça fazla yer yoktur. Birisi daha iyi bir cevaba sahip olmadıkça, yönetim bu gerçeğin farkına varmak zorundadır ve onlar için neyin daha önemli olduğuna karar verebilirler. Teşekkürler obrad. – Chev

İlgili konular