2012-08-10 44 views
9

Obtengo la excepción anterior mientras trato de cargar una vista.Ningún constructor sin parámetros definido para esta excepción de objeto mientras usa Unity Container

Estoy usando Unity para inicializar mi instancia de controlador. Aún obteniendo el error anterior.

Aquí está mi controlador.

public class SiteController : Controller 
{ 

    private ISiteRepository _repository; 

    public SiteController(ISiteRepository repository) 
    { 
     _repository = repository; 
    } 

    // 
    // GET: /Site/ 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    // 
    // GET: /Site/Details/5 

    public ActionResult Details(int id) 
    { 
     return View(); 
    }} 

Y aquí está mi Global.asax.cs a

protected void Application_Start() 
    { 
     ConfigApi(GlobalConfiguration.Configuration); 
     AreaRegistration.RegisterAllAreas(); 

     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 

    static void ConfigApi(HttpConfiguration config) 
    { 
     var unity = new UnityContainer(); 
     unity.RegisterType<SiteController>(); 
     unity.RegisterType<ISiteRepository, SiteRepository>(new HierarchicalLifetimeManager()); 

     config.DependencyResolver = new IocContainer(unity); 
    } 

Aquí está mi clase siteRepository.

public class SiteRepository:ISiteRepository 
{ 
    private readonly SampleMVCEntities _dbContext; 

    public SiteRepository() 
    { 
     _dbContext = new SampleMVCEntities(); 
    } 

    private IQueryable<SiteConfig> MapSiteConfig() 
    { 
     return _dbContext.SiteConfigs.Select(a => new SiteConfig 
     { 
      Name = a.Name, 
      LinkColour = a.LinkColour, 
      SiteLogo = a.SiteLogo, 
      SiteBrands = a.SiteBrands.Select(b => new Models.SiteBrand { SiteId = b.SiteId, BrandId = b.BrandId }) 
     }); 
    } 

    public IEnumerable<SiteConfig> GetAll() 
    { 
     return MapSiteConfig().AsEnumerable(); 
    }} 

Ésta es mi pila de errores.

No se ha definido ningún constructor sin parámetros para este objeto. Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[MissingMethodException: No parameterless constructor defined for this object.] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +114
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232 System.Activator.CreateInstance(Type type, Boolean nonPublic) +83 System.Activator.CreateInstance(Type type) +6 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +55

[InvalidOperationException: An error occurred when trying to create a controller of type 'Config.Controllers.SiteController'. Make sure that the controller has a parameterless public constructor.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +179
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +197 System.Web.Mvc.<>c_DisplayClass6.b_2() +49 System.Web.Mvc.<>c__DisplayClassb 1.<ProcessInApplicationTrust>b__a() +13 System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func
1 func) +88 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +268 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155


¿Puede alguien ayudarme?

Gracias.

+0

Su SiteController no parecen tener un constructor sin parámetros. ¿Has intentado agregar uno allí todavía? –

+0

Sí, no tiene un constructor sin parámetros. Y estoy inyectando la dependencia y también estoy configurando mi DependencyResolver personalizado. – Naresh

Respuesta

15

ASP.NET MVC y API web ASP.NET utiliza dos dispositivos de resolución de dependencia separados.

Para los controladores "normales" MVC que son deriva de Controller es necesario utilizar el DependencyResolver.SetResolver:

DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

Para los controladores de API WEP, que son deriva forma ApiController es necesario utilizar el GlobalConfiguration.Configuration.DependencyResolver como en su código.

Por lo tanto, si va a utilizar ambos tipos de controladores, debe registrar su contenedor dos veces.

Hay un buen artículo sobre cómo configurar la unidad para ambos solucionador de dependencias:

Dependency Injection in ASP.NET MVC 4 and WebAPI using Unity

+0

Gracias ...... Está funcionando – Naresh

Cuestiones relacionadas