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