2012-08-10 13 views
9

Ich erhalte die obige Ausnahme beim Versuch, eine Ansicht zu laden.Kein parameterloser Konstruktor für diese Objektausnahme bei Verwendung des Unity-Containers definiert

Ich verwende Unity, um meine Controller-Instanz zu initialisieren. Immer noch der obige Fehler.

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

Und hier ist mein Global.asax.cs zu

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

Hier ist meine SiteRepository Klasse.

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

Das ist mein Fehler-Stack.

Kein parameterloser Konstruktor für dieses Objekt definiert. Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es aus dem Code stammt.

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


Kann mir jemand helfen?

Danke.

+0

Ihr SiteController scheint nicht einen parameterlosen Konstruktor zu haben. Hast du schon versucht, einen hinzuzufügen? –

+0

Ja, es hat keinen parameterlosen Konstruktor. Und ich injiziere die Abhängigkeit und ich setze auch meinen benutzerdefinierten DependencyResolver. – Naresh

Antwort

15

ASP.NET MVC und ASP.NET Web API verwendet zwei separate Abhängigkeit Resolver.

Für „normale“ MVC-Controller, die stammt aus Controller sind müssen Sie die DependencyResolver.SetResolver verwenden:

DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

Für die Wep API-Controller, die Form herleitet sind ApiController Sie die GlobalConfiguration.Configuration.DependencyResolver wie in Ihrem Code verwenden müssen.

Wenn Sie also beide Arten von Controllern verwenden möchten, müssen Sie Ihren Container zweimal registrieren.

Es ist ein guter Artikel, wie die Einrichtung der Einheit für beide Abhängigkeitsauflöser:

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

+0

Danke ...... Es funktioniert – Naresh