2010-12-30 2 views
0

私のアカウントコントローラでは、nhibernateのセッションを取得しようとしていますが、私のコントローラファクトリクラス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' 'からである。このようなax.cs。本当の問題が何であるかを見るために、StructureMapへの呼び出しの回りで 'try-catch'を試してみてください。 – mookid8000

+0

はい、私はそれを解決した方法を示す答えを投稿しました。 – Waqas

答えて

0

感謝実際のエラーを見つけた後、私は自分のStructureMapControllerFactoryとGlobal.asを変更しました

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); 
     } 
関連する問題