gpt4 book ai didi

c# - Web API 请求后记录所需的 EF DbContext 的 CaSTLe Windsor Lifestyle

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:15 25 4
gpt4 key购买 nike

我将 CaSTLe Windsor 用于 Web API 2 的 DI 容器,我的一些 Controller 具有 EF DbContext 依赖项,我使用以下 CW 安装程序注入(inject)它们(这部分工作正常):

public class ApiControllerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly().BasedOn<ApiController>().LifestylePerWebRequest());
}
}

public class MyEntitiesInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<MyEntities>().LifestylePerWebRequest());
}
}

我还使用以下消息处理程序进行了全局日志记录:

public class LoggingHandler : DelegatingHandler
{
private readonly IWindsorContainer _container;

public LoggingHandler(IWindsorContainer container)
{
_container = container;
}

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
// Logic here to parse the request, send off the request, and then parse the response for logging info

// Log to database
using (MyEntities myEntities = _container.Resolve<MyEntities>())
{
// Log to database using MyEntities (DbContext)
}

return response;
}
}

...在 WebApiConfig.cs 中设置如下:

    public static void Register(HttpConfiguration config, IWindsorContainer container)
{
// Unrelated code

config.MessageHandlers.Add(new LoggingHandler(container));
}

问题是,当我尝试访问 MyEntities(它扩展了 EF DbContext)时,我在 LoggingHandler 中遇到异常,因为它说已经被处置了。我认为发生这种情况是因为 MyEntitiesInstaller 将其注册为 LifestylePerWebRequest() 并且此时请求已经完成。我不认为全局更改 DbContext 的生活方式是个好主意,因为出于 api Controller 的目的,我们确实希望它成为每个 Web 请求的一个实例。但是我如何防止它在日志记录发生之前被处置(或者更好的是,使用单独的实例进行日志记录)?

最佳答案

感谢@emodendroket 的评论为我指明了正确的方向。我能够通过在 Web 请求之外为我需要的 DbContext 使用不同的命名实例,使用短暂的生活方式(并在使用后立即手动处置)来实现这一点。

安装程序:

public class MyEntitiesInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<MyEntities>().LifestylePerWebRequest().IsDefault(),
Component.For<MyEntities>().Named("MyEntitiesTransient").LifestyleTransient());
}
}

日志处理程序的用法:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
// Logic here to parse the request, send off the request, and then parse the response for logging info

// Log to database
using (MyEntities myEntities = _container.Resolve<MyEntities>("MyEntitiesTransient"))
{
// Log to database using MyEntities (DbContext)

_container.Release(myEntities);
}

return response;
}

Controller 继续使用具有 per-web-request 生活方式的未命名/默认实例。

关于c# - Web API 请求后记录所需的 EF DbContext 的 CaSTLe Windsor Lifestyle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28989104/

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