2009-03-11 18 views
2

Mvc.Controller'dan kendim miras almış olan App.Controller var, o zaman tüm denetleyicilerim devralır. Bir arabirim kullanarak bir sağlayıcı yazdım ve MyService olarak uyguladı ve yapıcı HttpServerUtilityBase olan Mvc.ControllerServer özelliğini alır. Ancak, App.Controller yapıcıda MyService'u başlatıyorum. Sorun, denetleyicinin Server özelliğinin MyService yapılandırması sırasında null olmasıdır. Tabanın oluşturulması için public Controller() : base() { } kullanmıştım. Bununla birlikte, Server, null olarak kalır.Mvc.Controller'da Sunucuyu Kullanma

Mümkünse Web.HttpContext.Current.Server'dan kaçınmak istiyorum.

Bu soruna neden olan bir iş var mı?

Düzenleme: Eh, tvanfosson önerisini uygulamış ve benim uygulama mülkü get yöntemde MyService inşa zaman, Server hala boş.

Düzen 2: Nevermind, ben bir kandırdım. Ben Server kullanarak başka bir Controller vardı ve bunu değiştirmedi. Dava kapandı.

cevap

7

Hizmetinizi oluşturmak için gecikmeli başlatma kullanın. o denetleyici eylem ve Sunucu özelliği kurulduğunu zaman kullandığı kadar

private MyService service; 
public MyService Service 
{ 
    get 
    { 
     if (this.service == null) 
     { 
      this.service = new MyService(this.Server); 
     } 
     return this.service; 
    } 
} 

Ardından, hizmetin gerçekte örneği değil.

+0

Bu fikri beğendim ... –

+3

Veya geçersiz kılma Denetleyici.Doğru zamanda ateş eden başlatma. –

+1

Gecikmeli başlatma işleminin en iyi parçası, tesise hiçbir zaman erişilmediğinde hiçbir zaman gerçekleşmemesidir. – tvanfosson

0

App.Controller adlı yapının oluşturucusu MyService'u başlatıyorum.

Sorununuz var. Daha önce App.Controller yapıcınıza inşa edilmiş olan MyService örneğini iletmeniz gerekir. Kontrol/Bağımlılık Enjeksiyon modellerinin İnversiyonuna bir göz atın ve bu modelleri kolaylaştıran bazı kütüphanelere göz atın (see this list).

+0

ASP.NET MVC çok takılabilir ve kendi ControllerFactory'nizi yazabilir veya bir kitaplıktan kullanabilirsiniz. Autofac'ı seviyorum, bu yüzden ASP.NET MVC'ye Autofac'ın ControllerFactory'sini kullanmasını söylüyorum. Autofac, argümanları denetleyicimin yapıcılarına otomatik olarak bağlar ve kurucular tüm "kirlilikten" kurtulur. – yfeldblum

0

Neden Sunucu başvurusuna ihtiyacınız var? URL/html kodlaması gibi şeyler mi yapıyorsunuz? Eğer öyleyse, bunun yerine HttpUtility'u kullanabilir ve içerik referansından tamamen kurtulabilirsin.

+1

Server.MapPath kullanıyorum. –

0

Bu çok eski bir sorudur, ancak konu hala geçerlidir. Yani, 2017'de muhtemelen mevcut olmayan bir ipucu:

Controller yapıcı Server öğesinin boş olduğu doğrudur.

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 

    CurrentServer = Server; // CurrentServer is some instance variable I need later. 
} 

Bu benim için çalışıyor: Ama OnActionExecuting olayını kullanabilirsiniz.

İlgili konular