2011-08-26 27 views
2

我有一个asp.net过程,也消耗来自服务总线(MassTransit)的消息。对于webrequests,我的数据库会话使用PerWebRequest生活方式解决。温莎复合生活方式的asp.net过程

但是当进程消耗来自MassTransit的消息时,我需要数据库会话拥有另一种生活方式,因为没有HttpContext可用。

我有此:

public class PerRequestLifeStyleManager : ILifestyleManager 
{ 
    readonly PerWebRequestLifestyleManager perWebRequestLifestyleManager; 
    readonly PerThreadLifestyleManager perThreadLifestyleManager; 

    public PerRequestLifeStyleManager() 
    { 
     perWebRequestLifestyleManager = new PerWebRequestLifestyleManager(); 
     perThreadLifestyleManager = new PerThreadLifestyleManager();    
    } 

    public void Init(IComponentActivator componentActivator, IKernel kernel, ComponentModel model) 
    { 
     perWebRequestLifestyleManager.Init(componentActivator, kernel, model); 
     perThreadLifestyleManager.Init(componentActivator, kernel, model); 
    } 

    public object Resolve(CreationContext context) 
    { 
     return GetManager().Resolve(context); 
    } 

    public bool Release(object instance) 
    { 
     return GetManager().Release(instance); 
    } 

    public void Dispose() 
    { 
     GetManager().Dispose(); 
    } 

    ILifestyleManager GetManager() 
    { 
     if (HttpContext.Current != null) 
     { 
      return perWebRequestLifestyleManager; 
     } 

     return perThreadLifestyleManager; 
    } 
} 

谁能告诉我,如果这是正确的方式去?如果不是,那是什么?

谢谢。

编辑:我刚刚更新了一些代码似乎工作(未经测试之前)的问题。我仍然渴望知道,从温莎的角度来看,这是否安然无恙。

+1

一个好地方,检查,将是MassTransit邮件列表。 http://groups.google.com/group/masstransit-discuss我认为德鲁有足够的经验与城堡,他可以引导你在正确的方向,但我当然不会。我没有碰它;) – Travis

+0

我一直在那里,但只能通过它搜索。我认为这是一个温莎和MassTransit之间的相互关系有点太过分了:) ......但是,谢谢你的提示,我会在那里发布它! – asgerhallas

+0

这里有一些关于会话管理的讨论:http://groups.google.com/group/masstransit-discuss/browse_thread/thread/4be42a6319ce66ff/6f28a2eeea52278a?lnk=gst&q=windsor+lifestyle#6f28a2eeea52278a ...我什么都没有“不知道你是如何做出自定义的生活方式的,那是基于这两个回调之前/之后的...... – asgerhallas

回答

4

尝试使用其中一个hybrid lifestyles

+0

这只是完美的,谢谢!希望我曾想过混合动力,而不是复合材料:) – asgerhallas

+0

你知道一种方式来做到这一点与castle.windsor 3.0 – maxlego

+0

@ maxlego:是的,升级混合生活方式温莎3.0,然后给我一个拉请求。 –

3

通过使用Castle Windsor扩展,您应该能够将ISession作为消费者类的构造函数的依赖项。这样,容器将管理ISession的生命周期,并在消费者由MT处置后处置它。

如果您需要更多控制权,您可以查看WindsorConsumerFactory如何实现,以便将消息类实例的解析和发布包装到消费者的消息传递中。

如果你需要注入的东西,除此之外,您还可以使用拦截器:

Unit of work when using MassTransit

+0

感谢您在这里回答!我使用的是Windsor扩展程序,效果很好。我相信Before/AfterConsumingMessage拦截方法将是实现Windsor定制生活方式的最简单方法。但我想知道,它一次只能消费一条消息吗?如果不是,我怎么能知道我在某个特定时间之前和之后的信息? – asgerhallas

+0

为收到的每封邮件创建并发布新的使用者。在消费者的生命周期中,消费者的消费方法被调用一次以用于单个消息。所以我通常会让ISession成为一种暂时的消费者版本。 –

+0

好的。但后来我遇到了同样的问题,因为oll在这个线程http://groups.google.com/group/masstransit-discuss/browse_thread/thread/4be42a6319ce66ff/6f28a2eeea52278a?lnk=gst&q=windsor+lifestyle#6f28a2eeea52278a ...您希望将相同的ISession传递给依赖链中较长的服务。我会在你的邮件列表上打开一个主题:) – asgerhallas