2010-04-19 2 views
5

Новый замок/Виндзор, пожалуйста, несите меня.замок PerRequestLifestyle не признается

настоящее время я использую рамки System.Web.Mvc.Extensibility и его запуска кода, он зарегистрирован HttpContextBase как следующее:

container.Register(Component.For<HttpContextBase>().LifeStyle.Transient.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current))); 

То, что я хотел сделать, это изменить свое поведение и изменить образ жизни httpContextBase быть PerWebRequest.

так что я должен изменить код на следующее:

container.Register(Component.For<HttpContextBase>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current))); 

Однако, когда я делаю это, я получил следующее сообщение об ошибке:

System.Configuration.ConfigurationErrorsException: Looks like you forgot to 
register the http module Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule 
Add '<add name="PerRequestLifestyle" 
type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.MicroKernel" 
/>' to the <httpModules> section on your web.config 

который я сделал под <system.web> и <system.webServer>, однако , Я все равно получаю ту же ошибку. Любые намеки?

Заранее спасибо.

Update

добавлен блок кода в запрос

В рамках system.web.mvc.extensibility, есть класс называется extendedMvcApplication, которые наследуют от HttpApplication, и в методе Application_Start, он вызывает BootStrapper.Execute(). Эта реализация этого метода заключается в следующем:

public void Execute() 
    { 
     bool shouldSkip = false; 

     foreach (IBootstrapperTask task in ServiceLocator.GetAllInstances<IBootstrapperTask>().OrderBy(task => task.Order)) 
     { 
      if (shouldSkip) 
      { 
       shouldSkip = false; 
       continue; 
      } 

      TaskContinuation continuation = task.Execute(ServiceLocator); 

      if (continuation == TaskContinuation.Break) 
      { 
       break; 
      } 

      shouldSkip = continuation == TaskContinuation.Skip; 
     } 
    } 

Как вы можете видеть, он перебирает список IBootStrapperTask и пытается выполнить их. Так получилось, что у меня есть одна задача, зарегистрировать маршруты в моем MVC приложение:

public class RegisterRoutes : RegisterRoutesBase 
{ 
    private HttpContextBase contextBase; 

    protected override TaskContinuation ExecuteCore(IServiceLocator serviceLocator) 
    { 
     contextBase = serviceLocator.GetInstance<HttpContextBase>(); 
     return base.ExecuteCore(serviceLocator); 
    } 

    protected override void Register(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 
     routes.IgnoreRoute("{*robotstxt}", new { robotstxt = @"(.*/)?robots.txt(/.*)?" }); 

     XmlRouting.SetAppRoutes(routes, contextBase.Server.MapPath("~/Configuration/Routes.xml")); 
    } 
} 

вы можете увидеть, что мне нужно GetInstance (Resolve) в httpcontextbase объект таким образом, что я могу получить путь к серверу файла XML ,

+1

Когда вы решаете этот объект? в какой момент? –

+0

на Application_Start(), это слишком рано? – Herman

+0

@ Herman: он не поддерживается прямо сейчас. Что вы пытаетесь решить в Application_Start()? –

ответ

7

это письмо, PerWebRequest образ жизни не поддерживает решения в Application_Start().

См Описание проблемы и обсуждение:

Обходные для этого конкретного случая:

  1. Регистрация RegisterRoutes как, например, явно передавая его в у.е. rrent-контекст как параметр конструктора, например.:

    container.Register(Component.For<IBootstrapperTask>() 
              .Instance(new RegisterRoutes(Context))); 
    
  2. Использование HostingEnvironment.MapPath вместо contextBase.Server.MapPath. Хотите сделать это насмешливым? С его помощью можно с помощью простого интерфейса, например .:

    interface IServerMapPath { 
        string MapPath(string virtualPath); 
    } 
    
    class ServerMapPath: IServerMapPath { 
        public string MapPath(string virtualPath) { 
         return HostingEnvironment.MapPath(virtualPath); 
        } 
    } 
    
    container.AddComponent<IServerMapPath, ServerMapPath>(); 
    

Затем вводят IServerMapPath в свой RegisterRoutes.

+0

спасибо за обновление, обязательно посмотрим. – Herman

Смежные вопросы