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

enr*_*ein 3 scope httprequest autofac servicestack

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

我的问题是,如何在容器中设置它?我似乎无法在autofac中包含的方法中找到"PerHttpRequest"生命周期范围.我也不确定ServiceStack是否会在幕后为我做这种自动化操作.

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

小智 5

我想避免依赖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);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后用这个初始化

_autofacContainerRoot = builder.Build();
        IContainerAdapter adapter = new AutofacLifetimeScopeIocAdapter(container);

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

        container.Adapter = adapter;
Run Code Online (Sandbox Code Playgroud)

然后清理

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

        base.OnEndRequest();
    } 
Run Code Online (Sandbox Code Playgroud)

这似乎与Autofac - SingleInstance,InstancePerDependency和现在的InstancePerLifetimeScope(perRequest)一样.

HostContext.Instance.Items集合上的Mythz响应很可能用于删除对

var currentContainer = _container.Resolve<ILifetimeScope>();
Run Code Online (Sandbox Code Playgroud)

分辨率,应该提高性能.