2010-11-27 14 views
5

Se intentó utilizar Dependency Resolver con Unity, y tuve algún problema cuando mi Controller creó. Aquí ejemplo de controlador:MVC 3 beta + Dependency Resolver + Unity = got problem

public class AccountController : Controller 
{ 
    private readonly ICourseService _courseService; 

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

Pero, cuando el controlador intenta crear - Tengo una excepción "No constructor sin parámetros definidos para este objeto." Incluso trato de agregar el constructor predeterminado para este controlador, pero courseService no creó. También intente agregar propiedad con el atributo [Dependency]: no pasó nada. Aquí es la clase de resolución de dependencias:

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>(); 
    } 
} 

y Global.asax.cs:

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)); 
    } 

¿Puede alguien ayudarme?

+0

¿Alguna vez encontrar una solución a este problema, estoy consiguiendo el mismo error. Gracias – NullReference

Respuesta

2

Su implementación de IDependencyResolver requiere que AccountController esté registrado. Intente agregar este registro, de lo contrario, devolverá nulo y MVC intentará crear el controlador con el Activador, que requiere un ctor sin parámetros.

+0

El método GetService devolvió nulo cuando MVC solicitó HomeController, pero luego recibí una excepción "[MissingMethodException: no se definió ningún constructor sin parámetros para este objeto.]" Y "[InvalidOperationException: se produjo un error al intentar crear un controlador de tipo 'Sitio web. Controllers.AccountController '. Asegúrese de que el controlador tenga un constructor público sin parámetros.] ".Tal vez debería volver a escribir alguna clase para esto? – drsim

+0

intente agregar container.RegisterType () a Application_Start –

0

Su problema es que MVC aún intenta crear una instancia del controlador con la fábrica de controladores predeterminada, que requiere un constructor sin parámetros, y no tiene conocimiento de su contenedor Unity o cómo resolver la dependencia de ICourseService.

que necesita para construir una fábrica de controlador personalizado para tomar ventaja de la Unidad (en concreto uno que anula GetControllerInstance(Type type) - debe haber un montón de documentación y muestras alrededor de este, es una clase sencilla - y luego registrarlo en Application_Start de la siguiente manera:

ControllerBuilder.Current.SetControllerFactory (new MyUnityControllerFactory(container)); 
5

mensaje viejo, pero estas otras respuestas son de plano erróneas. Si este problema por mí mismo hoy en día, y que sin duda no tienen que registrar los controladores o una fábrica de controlador. este mensaje sólo significa que algo en la jerarquía de dependencias para el controlador no está registrado. Por ejemplo, si su controlador requiere IService en su constructor y IService requiere IReposit En su constructor, pero olvidó registrar IRepository, obtendrá este error.

+0

DanH es correcto, no es necesario registrar nada de lo que MVC puede crear una instancia. Esto incluiría los controladores. – bzarah

1

El código anterior se romperá si sus controladores tienen dependencias en tipos no registrados que son concretos. Debe modificar la GetService() a lo siguiente:

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

De esta forma si decir CourseService tiene una dependencia en el CourseRepository concreto, el contenedor instanciarlo.

Estoy con DanH en la suposición de que en algún lugar de la jerarquía hay un registro de tipo faltante, o una dependencia en un tipo concreto que no se está instalando.

tenía este mismo problema, y ​​encontró lo siguiente artículo útil:

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

Cuestiones relacionadas