AccountController似乎不能使用流畅的nhibernate和StructureMap

时间:2010-12-30 08:39:49

标签: asp.net-mvc fluent-nhibernate structuremap

在我的帐户控制器中,我试图获取nhibernate ISession的对象,但是在我的控制器工厂类StructureMapControllerFactory的CreateContoller方法中,它抛出“确保控制器具有无参数的公共构造函数。”。虽然使用任何其他控制器它可以正常工作。

下面是我的StructureMapControllerFactory类:

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);
            }
        }
}
来自Global.asax文件的

和代码片段:

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

例外:

{"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 个答案:

答案 0 :(得分:0)

感谢mookid8000给了我提示,在找到实际错误后,我改变了我的StructureMapControllerFactory和Global.asax.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);
        }