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