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