2012-08-10 19 views
9

Ricevo l'eccezione di cui sopra mentre trynig carica una vista.Nessun costruttore parametrico definito per questa eccezione oggetto durante l'utilizzo di Unity Container

Sto utilizzando Unity per inizializzare l'istanza del controller. Ancora ricevendo l'errore sopra.

Ecco il mio controller.

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

Ed ecco la mia 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); 
    } 

Qui è la mia classe 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(); 
    }} 

Questo è il mio errore di stack.

Nessun costruttore parametrico definito per questo oggetto. Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere la traccia dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.

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


Qualcuno può aiutarmi?

Grazie.

+0

tuo SiteController non sembrano avere un costruttore senza parametri. Hai provato ad aggiungerne uno ancora? –

+0

Sì, non ha un costruttore senza parametri. E sto iniettando la dipendenza e sto anche impostando il mio DependencyResolver personalizzato. – Naresh

risposta

15

ASP.NET MVC e API Web ASP.NET utilizza due resolver di dipendenza separati.

Per i controller "regolari" MVC, che sono deriva da Controller è necessario utilizzare il DependencyResolver.SetResolver:

DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

Per i controllori API WEP che sono deriva forma ApiController è necessario utilizzare il GlobalConfiguration.Configuration.DependencyResolver come nel codice.

Quindi se si prevede di utilizzare entrambi i tipi di controller è necessario registrare il contenitore due volte.

C'è un buon articolo come impostare l'Unità sia risolutore delle dipendenze:

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

+0

Grazie ... Sta funzionando – Naresh

Problemi correlati