2010-11-27 19 views
5

var ve bazı sorunun benim Kontrolör oluşturma aldık. kumandanın İşte örnek: Denetleyici oluşturmayı deneyinMVC 3 beta + Bağımlılık Çözümleyici + Birlik = I Unity ile Bağımlılık Çözümleyici kullanmaya çalıştı ediyorum sorunu

public class AccountController : Controller 
{ 
    private readonly ICourseService _courseService; 

    public AccountController(ICourseService courseService) 
    { 
     _courseService = courseService; 
    } 
} 

Ama - ı bir istisna var "Bu nesne için tanımlanan yok parametresiz yapıcı." Bu denetleyici için varsayılan kurucu eklemeye bile çalışıyorum, ancak hizmetService oluşturmadı. Ayrıca [Bağımlılık] özelliği ile özellik eklemeyi deneyin - hiçbir şey olmadı.

public class UnityDependencyResolver : IDependencyResolver 
{ 
    private readonly IUnityContainer _container; 
    public UnityDependencyResolver(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : new List<object>(); 
    } 
} 

ve Global.asax.cs: Burada Bağımlılık Çözümleyici sınıftır

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     var container = new UnityContainer(); 
     container.RegisterType<ICourseService, CourseService>(); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 

kimse bana yardımcı olabilir misiniz?

+0

Hiç bu soruna bir çözüm, ben de aynı hatayı alıyorum buldunuz. Teşekkür MVC HomeController istendiğinde – NullReference

cevap

2

IDependencyResolver uygulamanız, AccountController'ın kayıtlı olmasını gerektirir. Bu kaydı eklemeyi deneyin, aksi takdirde boşa dönecek ve MVC, denetleyiciyi parametreleştirilmemiş bir ctor gerektiren Aktivatör ile oluşturmaya çalışacaktır.

+0

GetService yöntemi null adlı döndü ama sonra bir istisna "[MissingMethodException: Bu nesne için tanımlanan yok parametresiz oluşturucu.]" Var ve "[ınvalidoperationexception: Web sitesi 'türünde bir denetleyici oluşturulmaya çalışılırken bir hata oluştu. Controllers.AccountController '. Denetleyicinin parametresiz bir kamu yapıcısına sahip olduğundan emin olun.] ".Belki bunun için bir sınıfa tekrar yazmalı mıyım? – drsim

+0

container.RegisterType'ı eklemek için deneyin. () - Application_Start –

0

Sorununuz, MVC'nin denetleyiciyi parametresiz bir yapıcı gerektiren varsayılan denetleyici fabrikasıyla başlatmaya çalıştığı ve Birlik kabınızı veya ICourseService bağımlılığını nasıl çözebileceğini bilmediği şeklindedir. Bunun için dokümantasyon ve çevresindeki örneklerin çok olacak -

Sen Unity (özellikle GetControllerInstance(Type type) geçersiz kılar birinin yararlanmak için özel bir denetleyici fabrikası kurmayı ihtiyaç duyarlar, çünkü basit bir sınıf - ve aşağıdaki gibi daha sonra Application_Start bunu kayıt:

ControllerBuilder.Current.SetControllerFactory (new MyUnityControllerFactory(container)); 
5
ama bu cevaplar yanlış dışarı düz. Bu sorun kendimi bugün Had vardır ve kesinlikle denetleyicileri veya kontrolör fabrika kayıt gerekmez. Bu mesaj sadece anlamına

Eski sonrası o bağımlılık hiyerarşisinde bir şey için Denetleyici kayıtlı değil.Eğer kontrolcünüz IService gerektirirse, kurucu ve IService gerektirir IR kurucusunda ory, ama bu hatayı alacak olan İdare'yi kaydetmeyi unuttun.

+0

DanH doğrudur, MVC'nin kendisini başlatabildiği hiçbir şey kaydetmeye gerek yoktur. Bu kontrolörleri içerir. – bzarah

1

sizin kontrolörleri beton sigara kayıtlı türlerinde bağımlılıkları varsa Yukarıdaki kod kıracak. Aşağıdakine GetService() değiştirmek gerekir:

public object GetService(Type serviceType){ 
    if (!container.IsRegistered(serviceType)){ 
     if (serviceType.IsAbstract || serviceType.IsInterface){ 
     return null; 
     } 
    } 
    return container.Resolve(serviceType); 
    } 

CourseService beton CourseRepository bir bağımlılığı vardır dersem Bu şekilde, kabın onları örneğini.

Hiyerarşideki bir yerlerin eksik bir tip kaydı ya da somut olmayan bir tipte bir bağımlılık olduğu varsayımıyla DanH ile birlikteyim.

Bu aynı sorunu vardı ve yararlı aşağıdaki makale buldum:

http://xhalent.wordpress.com/2011/01/17/using-unity-as-a-dependency-resolver-asp-net-mvc-3/

İlgili konular