2009-06-05 27 views
5

Bu hat boyunca bir şey yapmalı mıyım? Tüm denetleyicileri BaseController'dan miras almayı düşünüyorum. Bu, IoC'nin tasarım modelini kırdı mı? Bunun yerine başka ne yapmalıyım?IoC ve ASP.NET MVC Denetleyicileri

public class BaseController: Controller 
{ 
    protected ICookieService CookieService { 
     get { 
      return ServiceResolver.Resolve<ICookieService>(new { HttpContext = HttpContext }); 
     } 
    } 
    protected IDateTimeService DateTimeService { 
     get { 
      return ServiceResolver.Resolve<IDateTimeService>(); 
     } 
    } 
    protected ISettingsService SettingsService { 
     get { 
      return ServiceResolver.Resolve<ISettingsService>(); 
     } 
    } 

} 

cevap

10

Kurucu enjeksiyonu ile gitmek ve sizin için bir controllerfactory enjekte etmek çok daha kolay olurdu. Yapabilecekleriniz varsa, kurucu enjeksiyonu ile uzaklaşabiliyorsanız bir servis belirleyici (ServiceResolver) kullanmayın.

bağlantı StructureMap ile nasıl yapılacağını gösterir Adding a controller factory to ASP MVC

üzerinde üzerinde bazı bilgiler var ve Unity üzerinden anlaşıldığından, ancak adapte basit olmalıdır.

+1

Katılıyorum. Tür çözümleyicinizi yalnızca uygulamanızın kökünde kullanmalısınız. Enjektörleri değiştirmeniz gerekmediğinden başka bir nedenden ötürü, tüm kodunuzu değiştirmek zorunda kalmazsınız, sadece ilk nesneyi hangi noktada tutmanız gerekir. Benim uygulamada enjektör hakkında bilen tek yer Global.asax, ve ben bile orada çok fazla yerde kullanıyorum (bu, ben 2 yerde kullanıyorum). Kurucu enjeksiyon ile her şey sadece yerine düşer ve nesneniz her şeyden yalıtılmıştır – Talljoe

+0

Aslında Castle Windsor'u kullanıyorum ama karmaşıklığını/bağımlılığını gizlemek için sarmalayıcı arayüzleri seti ile birlikte –

+0

Yardımlarınız için teşekkür ederiz! –

0

Sahip olduğunuz korunan arabirimlerin denetleyici için bağımlı olduğunu varsayalım. Bağımlılıkları sizin için enjekte etmek için bir IoC konteyneri kurmak mümkün. Castle Windsor ile kesinlikle yapılabilir. IoC konteynerinin, enjekte edebilecekleri diğer hizmetleri bildiği sürece, gerekli bağımlılıklara sahip bir kurucuya sahip olmanız için BaseController sınıfını değiştirmeniz gerekecektir. Inversion of Control ve Component-Driven Development arkasında ilkelerin

0

One (web hizmeti host veya nesne veri kaynaklarında yani .:) başka hiçbir yolu yoktur, yalnızca statik hizmet konumlandırıcılarını kullanmayla ilgili olduğunu.

Teknik olarak, statik servis konumlandırıcıları kullanarak temel denetleyici IoC'yi ihlal etmiyor, sadece kullanmıyor.

Autofac IoC konteyneri ve ASP.NET MVC (diğer kaplar da bunu yapabilmelidir) arasında existing integration'a bakın.