gpt4 book ai didi

scope - 当用作 ServiceStack 的 IoC 时,在 autofac 中配置生命周期范围

转载 作者:行者123 更新时间:2023-12-01 07:27:48 25 4
gpt4 key购买 nike

我目前使用 AutoFac 作为我们 ServiceStack Web 服务应用程序的 DI 容器。我能够配置接线和所有内容,但是在阅读了有关范围的部分后,我不知道在注册我的组件时最好使用哪个范围。在我们的特定情况下,我认为 PerHttpRequest 范围是可以的,因为(如果我错了,请纠正我)我想在请求结束后立即处理依赖项。

我的问题是,如何在容器中设置它?我似乎无法在 autofac 中包含的方法中找到“PerHttpRequest”生命周期范围。我也不确定 ServiceStack 是否在幕后为我做某种自动魔术。

我在 .Net 4 上的 ServiceStack 3.9.35 上使用 Autofac 3.0.1(作为常规 ASP 主机运行,而不是 MVC)。我也在使用描述的类 here作为 IContainer 适配器。

最佳答案

我想避免依赖 MVC 的开销,所以第一个答案对我来说不太适用。

相反,我使用 Funq 注册了一个 PerRequest ILifetimeScope,并在解析依赖之前解析了 ConatinerAdaptor 中的 ILifetimeScope。

public class AutofacLifetimeScopeIocAdapter : IContainerAdapter
{
private readonly Container _requestContainer;

public AutofacLifetimeScopeIocAdapter(Funq.Container requestContainer)
{
_requestContainer = requestContainer;
}


public T Resolve<T>()
{
var currentContainer = _requestContainer.Resolve<ILifetimeScope>();

return currentContainer.Resolve<T>();
}

public T TryResolve<T>()
{
var currentContainer = _requestContainer.Resolve<ILifetimeScope>();

T result;

if (currentContainer.TryResolve<T>(out result))
{
return result;
}

return default(T);
}

}

然后用这个初始化
_autofacContainerRoot = builder.Build();
IContainerAdapter adapter = new AutofacLifetimeScopeIocAdapter(container);

container.Register<ILifetimeScope>((c) => _autofacContainerRoot.BeginLifetimeScope())
.ReusedWithin(ReuseScope.Request);

container.Adapter = adapter;

然后清理
public override void OnEndRequest()
{
var currentContainer = _container.Resolve<ILifetimeScope>();
currentContainer.Dispose();

base.OnEndRequest();
}

这似乎符合 Autofac 的要求 - SingleInstance、InstancePerDependency 和现在是 perRequest 的 InstancePerLifetimeScope。

HostContext.Instance.Items 集合上的 Mythz 响应可能可用于消除对
var currentContainer = _container.Resolve<ILifetimeScope>();

分辨率,这应该会提高性能。

关于scope - 当用作 ServiceStack 的 IoC 时,在 autofac 中配置生命周期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14835471/

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