我想在ASP.NET MVC应用程序中为我的一个控制器添加每个会话的生活方式,但它目前没有这样的选项。我搜索了stackoverflow并找到了下一个解决方案
public class PerSessionLifestyleManager : AbstractLifestyleManager
{
private readonly string PerSessionObjectID = "PerSessionLifestyleManager_" + Guid.NewGuid().ToString();
public override object Resolve(CreationContext context)
{
if (HttpContext.Current.Session[PerSessionObjectID] == null)
{
// Create the actual object
HttpContext.Current.Session[PerSessionObjectID] = base.Resolve(context);
}
return HttpContext.Current.Session[PerSessionObjectID];
}
public override void Dispose()
{
}
}
但我希望能够写出像
这样的想法 cr => cr.LifeStyle.PerSession.Named(cr.Implementation.Name)
我使用Castle Windsor 3.0并发现LifestyleType枚举包含在Castle.Core命名空间内,它由DefaultKernel使用。我的建议是覆盖DefaultKernel,但我真的不知道怎么做它是无错误的,如果Perseession的生活方式如果与dll一起出售,那就好了。
答案 0 :(得分:2)
所以你要问的有两件事。
首先是如何实现生活方式。好的起点是看看每个网络请求的生活方式是如何实现的(使用带有自定义范围和范围访问者的Scoped生活方式)
其次,如何在API中表现出来。我建议使用一种扩展方法,将LifestyleScoped<YourCustomScopeAccessor>()
的较低级别调用封装为LifestylePerSession()
,类似于WCF Facility does it。