Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc AccountController没有';似乎无法使用流畅的nhibernate和StructureMap_Asp.net Mvc_Fluent Nhibernate_Structuremap - Fatal编程技术网

Asp.net mvc AccountController没有';似乎无法使用流畅的nhibernate和StructureMap

Asp.net mvc AccountController没有';似乎无法使用流畅的nhibernate和StructureMap,asp.net-mvc,fluent-nhibernate,structuremap,Asp.net Mvc,Fluent Nhibernate,Structuremap,在我的帐户控制器中,我试图获取nhibernate ISession的对象,但在控制器工厂类StructureMapControllerFactory的CreateContoller方法上,它抛出“确保控制器具有无参数公共构造函数”。虽然与任何其他控制器,它工作良好 下面是我的StructureMapControllerFactory类: public class StructureMapControllerFactory : DefaultControllerFactory {

在我的帐户控制器中,我试图获取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();
        }

感谢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;
            }

        }
    }

受保护的无效应用程序\u Start()
{
var container=new StructureMap.container(配置=>
{                    
config.For()
.使用(系统.网络.安全.会员.提供商);
config.For()
.使用();
config.For()
.使用();
config.For()
.Singleton()
.Use(SmartHRMS.Utility.SessionHelper.GetSessionFactory());
config.For()
.HttpContextScoped()
.Use(context=>context.GetInstance().OpenSession());
});
ControllerBuilder.Current.SetControllerFactory(新的SmartHRMS.Utility.StructureMapControllerFactory(容器));
RegisterAllAreas();
注册地址(RouteTable.Routes);
}

您发布的异常消息来自试图实例化控制器的
DefaultControllerFactory
。试着删除调用StructureMap时出现的
Try catch
内容,看看真正的问题是什么。是的,它成功了,我发布了一个答案来说明我是如何解决的
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);
        }