C# 为温莎集装箱添加新的定制生活方式
我想在ASP.NET MVC应用程序中为我的一个控制器添加每会话的生活方式,但它当前没有这样的选项。我已经搜索了stackoverflow并找到了下一个解决方案C# 为温莎集装箱添加新的定制生活方式,c#,.net,castle-windsor,C#,.net,Castle Windsor,我想在ASP.NET MVC应用程序中为我的一个控制器添加每会话的生活方式,但它当前没有这样的选项。我已经搜索了stackoverflow并找到了下一个解决方案 public class PerSessionLifestyleManager : AbstractLifestyleManager { private readonly string PerSessionObjectID = "PerSessionLifestyleManager_" + Guid.Ne
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,发现Lifestyle类型枚举包含在Castle.Core名称空间中,它正被DefaultKernel使用。我的建议是覆盖DefaultKernel,但我真的不知道如何做到它没有bug,看起来就像是dll附带的PerSession lifestyle一样。因此,有两件事你要问 首先是如何实施生活方式。一个好的起点是了解如何实现每个web请求的生活方式(使用具有自定义作用域和作用域访问器的作用域生活方式)
第二,如何在API中表现出这一点。我建议使用一种扩展方法,将对
LifestyleScoped()
的较低级别调用封装为LifestylePerSession()
,类似于WCF Facility的方式。第一种方法似乎是在问题中发布的类中实现的。但是我不确定我是否完全接受你的第二个建议。哦,你发布的生活方式实现是有缺陷的,主要是因为它永远不会释放对象。我觉得有足够多的网页具有相应的工作流。对于这些页面,拥有会话生活方式是很自然的。所以我的最后一个问题是-为什么这没有在Castle中实现?不这样做有什么原因吗?似乎没有人需要它,也没有人关心它的实施。通常,最好是每个web请求组件从持久性存储中获取共享状态,而不是将内存与那些通常会不必要地占用它的大型对象混在一起。我认为这是一个很差的实践,但是如果应用程序是Intranet,会话对象是合理的小,那么持久存储可能是一个过压。