Виндзор композитный образ жизни для процесса asp.net - PullRequest
2 голосов
/ 26 августа 2011

У меня есть процесс asp.net, который также использует сообщения из сервисной шины (MassTransit). Для веб-запросов мой сеанс базы данных разрешается с помощью образа жизни 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;
    }
}

Может кто-нибудь сказать мне, если это правильный путь? А если нет, то что?

Спасибо.

РЕДАКТИРОВАТЬ: я только что обновил вопрос с некоторым кодом, который, кажется, работает (до того, как он не был проверен). Я все еще хочу знать, является ли это - если смотреть с точки зрения Виндзора - безопасным и надежным.

Ответы [ 2 ]

4 голосов
/ 26 августа 2011

Попробуйте использовать один из гибридных стилей жизни .

3 голосов
/ 26 августа 2011

Используя расширение Castle Windsor, вы просто должны иметь возможность использовать ISession в качестве зависимости от конструктора потребительского класса.Таким образом, контейнер будет управлять жизненным циклом ISession и утилизировать его после того, как потребитель будет утилизирован MT.

Если вам нужен еще больший контроль, вы можете посмотреть, как реализован WindsorConsumerFactory для переносаразрешение и освобождение экземпляра класса потребителя при доставке сообщения потребителю.

Если вам нужно внедрить что-то еще, вы также можете использовать перехватчик:

Единицаработы при использовании MassTransit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...