我目前正在使用 AutoFac 作为我们的 ServiceStack Web 服务应用程序的 DI 容器。我能够配置接线和所有内容,但在阅读了有关范围的部分后,我不知道在注册我的组件时最好使用哪个范围。在我们的特定情况下,我认为 PerHttpRequest 范围就可以了,因为(如果我错了,请纠正我)我希望在请求结束后立即处理依赖项。
我的问题是,如何在容器中设置它?我似乎无法在 autofac 中包含的方法中找到“PerHttpRequest”生命周期范围。我也不确定 ServiceStack 是否会在幕后自动为我执行此操作。
我在 .Net 4 上的 ServiceStack 3.9.35 上使用 Autofac 3.0.1(作为常规 ASP 主机运行,而不是 MVC)。我也在使用所描述的类here https://github.com/ServiceStack/ServiceStack/wiki/The-IoC-container作为 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,以及现在的 InstancePerLifetimeScope(即 perRequest)。
HostContext.Instance.Items 集合上的 Mythz 响应可能可用于消除对
var currentContainer = _container.Resolve<ILifetimeScope>();
分辨率,这应该会提高性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)