【问题标题】:Autofac Session ScopeAutofac 会话范围
【发布时间】:2009-09-09 16:56:36
【问题描述】:

我正在调查我们在过去使用 Castle Windsor 的 Web 应用程序中使用 Autofac 的情况。

我真正喜欢 Autofac 的一点是能够通过 lamda 表达式表达动态组件构造,而不是在 Windsor 中创建 DependancyResolvers 等。

我遇到的一种情况是,我希望在 ASP.NET 会话级别范围内注册特定组件。使用 Windsor,我会创建/获取新的 LifestyleManager,但是使用 Autofac 我想出了这个:

//Register SessionContext at HTTP Session Level
builder.Register(c =>
{
    HttpContext current = HttpContext.Current;

    //HttpContext handes delivering the correct session
    Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext;

    if (instance == null)
    {
        instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>();
        current.Session["SessionContext"] = instance;
    }

    return instance;
})
.FactoryScoped();

在某些时候我可能会变成一种扩展方法。如果 HttpContext.Current.Session 为空,我接受这个实现会爆炸,因为它应该只在网络应用程序中使用。

问题是:

在 Autofac 中进行此类注册的最佳做法是什么。我已经看到很多关于使用嵌套容器等的提及,但没有具体的例子,我很想了解上述方法可能有什么问题(我唯一能想到的就是自动处理的东西)。

谢谢。

【问题讨论】:

    标签: autofac


    【解决方案1】:

    这看起来不错。

    标记组件“ExternallyOwned()”将确保 Autofac 不会在其上调用 Dispose()

    这里唯一的问题是你的会话范围的组件可以通过当前容器解决它自己的依赖关系,因此持有对可能属于当前请求的事物的引用(例如)。这应该很容易发现测试。

    【讨论】:

    • 嗨尼克。感谢您的反馈,关于使用嵌套容器来管理 Web 应用程序中的范围,您是否知道任何具体示例,例如 Global.asx 文件,该文件将显示每个容器的构建和“使用”位置?在文档中看不到。
    • 不确定它是 100% 最新的,但这应该会有所帮助:code.google.com/p/autofac/source/browse/branches/1.4/src/…
    猜你喜欢
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多