سؤال

جديد على القلعة/وندسور ، يرجى تحمل معي.

أنا أستخدم الإطار حاليًا System.Web.MvC.Extensibility وفي رمز البدء ، قامت بتسجيل httpcontextbase مثل ما يلي:

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

ما أردت فعله هو تغيير السلوك وتغيير نمط حياة httpcontextbase ليكون بيرنبريكست.

لذلك قمت بتغيير الرمز إلى ما يلي:

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>, ومع ذلك ، ما زلت أحصل على نفس الخطأ. أي تلميحات؟

شكرا مقدما.

تحديث

إضافة كتلة رمز لكل طلب

في إطار عمل System.Web.MvC.Extensialible ، هناك فئة تسمى 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"));
    }
}

يمكنك أن ترى أنني بحاجة إلى الحصول على كائن httpcontextbase httpcontextbase بحيث يمكنني الحصول على مسار الخادم لملف XML.

هل كانت مفيدة؟

المحلول

حتى كتابة هذه السطور ، لا يدعم PerwebRequest Lifestyle حل في Application_Start ().

انظر وصف القضية والمناقشة:

الحلول لهذه الحالة بالذات:

  1. يسجل RegisterRoutes كمثال ، تمريره صراحة السياق الحالي كمعلمة مُنشئ ، على سبيل المثال:

    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.

نصائح أخرى

يحاول مابي إضافته ضمن الوحدات النمطية ، كما هو الحال هنا:IIS7 & castle.microkernel.lifestyle.perwebrequestlifestylemodule مشاكل التسجيل

http://www.jasonlinham.co.uk/2009/02/castle-and-iis7.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top