2

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

但是当进程使用来自 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;
    }
}

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

谢谢。

编辑:我刚刚用一些似乎有效的代码更新了这个问题(在它未经测试之前)。我仍然很想知道这——从温莎的角度来看——是否安全可靠。

4

2 回答 2

4

尝试使用其中一种混合生活方式

于 2011-08-26T13:34:29.730 回答
3

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

如果您需要更多控制,您可以查看 WindsorConsumerFactory 是如何实现的,以将消费者类实例的解析和释放包装在将消息传递给消费者的过程中。

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

使用 MassTransit 时的工作单元

于 2011-08-26T17:09:52.977 回答