CastleWindsor LifestylePerWebRequest无法正常工作

时间:2019-06-19 16:06:51

标签: c# asp.net-mvc inversion-of-control castle-windsor ioc-container

我正在使用CastleWindsor在ASP.NET 5应用程序中执行IOC

我遇到了一个问题,我似乎无法正确地使LifestylePerWebRequest在我的一个项目中工作。

我大致有以下代码:

container.Register(Classes.FromThisAssembly()
    .Pick()
    .If(t => t.Name.EndsWith("Controller"))
    .Configure(configurer => configurer.Named(configurer.Implementation.Name))
    .LifestylePerWebRequest(),

    Component.For<IAppSettings>().Instance(AppSettings.Instance).LifestyleSingleton(),

    Component.For<IUserRepository>().ImplementedBy<UserRepository>(),
    Component.For<IUserService>().ImplementedBy<UserService>(),
    //all my other services/repos

    //and then
    Component.For<IOwinContext>().ImplementedBy<IOwinContext>()
                                    .UsingFactoryMethod(o => HttpContext.Current.GetOwinContext(), true)
                                    .LifestylePerWebRequest(),

    Component.For<IAuthenticationManager>().ImplementedBy<IAuthenticationManager>()
                                        //Line below only gets called once (when the first request is made), should be called for each new request...
                                        .UsingFactoryMethod(o => o.Resolve<IOwinContext>().Authentication, true) 
                                        .LifestylePerWebRequest()

);

按照名称,我希望LifestylePerWebRequest()的行为是每次将新请求发送到服务器时都调用工厂方法。但是,我的工厂方法仅被调用一次(发出第一个请求时)。

我还验证了CastleWindsor模块已加载,并且可以看到__DynamicModule_Castle.Facilities.AspNet.SystemWeb.PerWebRequestLifestyleModule, Castle.Facilities.AspNet.SystemWeb, Version=5.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc_aad31f05-1937-4d39-b48f-3b2b7344d750

有人遇到过同样的问题吗?

1 个答案:

答案 0 :(得分:1)

终于让我意识到发生了什么事。默认情况下,CastleWindsor中的对象是Singletons

我的仓库/服务对象引用了我的Owin对象。因为它们本身是Singletons,所以我的引用就像Singletons一样。

如果在某处有警告告知您,这将是很好的。

基本上,所有引用具有LifestylePerWebRequest()的对象的对象本身都必须显然实现LifestylePerWebRequest()