1

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

我真正喜欢 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 中进行此类注册的最佳做法是什么。我看到很多关于使用嵌套容器等的提及,但没有具体的例子,我很想了解上述方法可能有什么问题(我唯一能想到的就是自动处理的东西)。

谢谢。

4

1 回答 1

0

这看起来不错。

标记组件“ExternallyOwned()”将确保 Autofac 不会调用Dispose()它。

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

于 2009-09-10T05:00:49.217 回答