2010-12-30 2 views
0

내 계정 컨트롤러에서 nhibernate Isession 개체를 얻으려고하지만 내 컨트롤러 팩토리 클래스 인 StructureMapControllerFactory의 CreateContoller 메서드에서 "컨트롤러에 매개 변수가 없는지 확인하십시오 공공 생성자. " 다른 컨트롤러에서는 잘 작동하지만 Global.asax 파일에서AccountController 유창한 nhibernate 및 StructureMap 작동하지 않는 것

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
     public override IController CreateController(RequestContext requestContext, string controllerName) 
     { 
      try 
      { 
       var controllerType = base.GetControllerType(requestContext, controllerName); 
       return ObjectFactory.GetInstance(controllerType) as IController; 
      } 
      catch (Exception) 
      { 
       //Use the default logic 
       return base.CreateController(requestContext, controllerName); 
      } 
     } 
} 

와 코드 조각 : 아래

내 StructureMapControllerFactory 클래스입니다

protected void Application_Start() 
     { 
      ControllerBuilder.Current.SetControllerFactory(new SmartHRMS.Utility.StructureMapControllerFactory()); 
      StructureMap.ObjectFactory.Initialize(x => 
       { 
        x.For<NHibernate.ISessionFactory>() 
         .Singleton() 
         .Use(SmartHRMS.Utility.SessionHelper.GetSessionFactory()); 

        x.For<NHibernate.ISession>() 
         .HttpContextScoped() 
         .Use(context => context.GetInstance<NHibernate.ISessionFactory>().OpenSession()); 
       }); 

      AreaRegistration.RegisterAllAreas(); 
      RegisterRoutes(RouteTable.Routes); 
     } 

     protected void Application_EndRequest() 
     { 
      StructureMap.ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
     } 

예외 : 나에게 힌트를 준 mookid8000에

{"An error occurred when trying to create a controller of type 'HCM.Controllers.AccountController'. Make sure that the controller has a parameterless public constructor."} 
+1

당신이 게시 예외 메시지가 DefaultControllerFactory'이 컨트롤러를 인스턴스화하려고'에서이다. 실제 문제가 무엇인지 확인하기 위해 StructureMap에 대한 호출 주위에서'try-catch' 물건을 제거해보십시오. – mookid8000

+0

네, 트릭을했는데, 어떻게 해결했는지 보여주는 답변을 올렸습니다. – Waqas

답변

0

감사합니다 , 실제 오류를 발견 한 후 내 StructureMapControllerFactory 및 Global.as 변경 이 같은 ax.cs :

public class StructureMapControllerFactory : DefaultControllerFactory 
    { 
     readonly Container container; 

     public StructureMapControllerFactory(Container container) 
     { 
      this.container = container; 
     } 

     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
     { 
      if (controllerType == null) 
       return base.GetControllerInstance(requestContext, controllerType); 
      try 
      { 
       return container.GetInstance(controllerType) as Controller; 
      } 
      catch (StructureMapException) 
      { 
       throw; 
      } 

     } 
    } 

protected void Application_Start() 
     { 
      var container = new StructureMap.Container(config => 
       {      
        config.For<System.Web.Security.MembershipProvider>() 
         .Use(System.Web.Security.Membership.Provider); 

        config.For<SmartHRMSTest.Controllers.IFormsAuthentication>() 
         .Use<SmartHRMSTest.Controllers.FormsAuthenticationService>(); 

        config.For<SmartHRMSTest.Controllers.IMembershipService>() 
         .Use<SmartHRMSTest.Controllers.AccountMembershipService>(); 

        config.For<NHibernate.ISessionFactory>() 
         .Singleton() 
         .Use(SmartHRMS.Utility.SessionHelper.GetSessionFactory()); 

        config.For<NHibernate.ISession>() 
         .HttpContextScoped() 
         .Use(context => context.GetInstance<NHibernate.ISessionFactory>().OpenSession()); 
       }); 

      ControllerBuilder.Current.SetControllerFactory(new SmartHRMS.Utility.StructureMapControllerFactory(container)); 

      AreaRegistration.RegisterAllAreas(); 
      RegisterRoutes(RouteTable.Routes); 
     }