AccountController, кажется, не работает с беглым nhibernate и StructureMap - PullRequest
0 голосов
/ 30 декабря 2010

В моем контроллере учетной записи я пытаюсь получить объект nhibernate ISession, но в методе CreateContoller класса фабрики моего контроллера StructureMapControllerFactory выдается «Убедитесь, что у контроллера есть открытый конструктор без параметров».Хотя с любым другим контроллером он работает нормально.

Ниже приведен мой класс 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 голосов
/ 30 декабря 2010

Благодаря 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);
        }
...