gpt4 book ai didi

c# - CaSTLeWindsor LifeStyle.PerWebRequest 表现得像单例

转载 作者:行者123 更新时间:2023-11-30 12:57:20 27 4
gpt4 key购买 nike

我正在尝试创建一个我可以注入(inject)到我的类中的 UserService,它将保存当前登录到我的系统的用户。我正在使用 CaSTLeWindsor 作为我的容器。

现在我的问题是我试图让我的 UserService 成为一次性的,这样在对象被销毁时,在创建时获取用户的数据库连接也会被丢弃。

我在 Global.asax.cs 中添加了以下设置:

private static void BootstrapContainer()
{
_container = new WindsorContainer().Install(FromAssembly.This());

var controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);

GlobalConfiguration.Configuration.DependencyResolver = new WindsorDependencyResolver(_container.Kernel);

_container.Register(Component.For<IUserService>()
.LifestylePerWebRequest()
.ImplementedBy<UserService>());

_container.Register(Component.For<IPrincipal>()
.LifeStyle.PerWebRequest
.UsingFactoryMethod(() => HttpContext.Current.User));
}

在我的 Application_Start 中调用。

我的UserService代码如下:

public interface IUserService
{
OrganisationBruger User { get; }
int UserId { get; }
}

public class UserService : IUserService, IDisposable
{
private readonly IPrincipal _principal;
private OrganisationBruger _user;
private readonly DatabaseDataContext _db;

public UserService(IPrincipal principal, IDatabaseDataContextFactory dataContextFactory)
{
_principal = principal;
_db = dataContextFactory.GetDataContext();
}

public OrganisationBruger User => _user ?? (_user = GetUser());
public int UserId => Convert.ToInt32(_principal.Identity.Name);

private OrganisationBruger GetUser()
{
return _db.OrganisationBrugers.Single(u => u.ID == UserId);
}

public void Dispose()
{
_db.Dispose();
}
}

当我调试我的代码时,我可以在第一个请求中看到我触发它正确地创建类 UserService.cs,然后在 webrequest 之后处理它。现在我的问题是第二个 Web 请求似乎不再调用构造函数,因此只是重用以前创建的对象。这导致 DatabaseContext 已经被处理掉。

我认为 LifestylePerWebRequest 意味着 UserService 会根据每个请求重新创建。谁能帮助我理解这一点?

最佳答案

所以首先我忽略了文档中的“模块注册”部分。您需要将以下内容添加到您的 web.config 中:

<httpModules>
<add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor"/>
</httpModules>

其次,我不是百分百确定依赖解析器是如何工作的。问题是使用我的 UserService 作为依赖项的模块之一将其生命周期设置为 Singleton 这是默认行为,当您在注册模块时未指定任何关于生命周期的信息容器。

我通过确保使用我的 UserService 作为依赖项的每个模块也使用 LifestylePerWebRequest()LifestyleTransient() 的生命周期注册来解决这个问题。

关于c# - CaSTLeWindsor LifeStyle.PerWebRequest 表现得像单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34899924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com