我正在研究过去曾使用Castle Windsor的网络应用程序中使用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为null,我接受这个实现会炸弹,因为它只应该在Web应用程序中使用。
问题是:
在Autofac中进行此类注册的最佳做法是什么?我已经看到很多关于嵌套容器等的使用的提及,但没有具体的例子,我很想知道上述方法可能出现的问题(我只能想到的是自动处理的东西)。 p>
感谢。
答案 0 :(得分:0)
看起来很好。
标记组件'ExternallyOwned()'将确保Autofac不会在其上调用Dispose()
。
这里唯一的问题是你的会话范围的组件可以通过当前容器解析它自己的依赖关系,从而保存对可能属于当前请求的东西的引用(例如)。这应该很容易被发现虽然测试。