архитектурный вопрос asp.net mvc, nhibernate, замок - PullRequest
0 голосов
/ 04 марта 2010

Я реализовал сервис, который использует DAOFactory и NHibernate Helper для сеансов и транзакций. Следующий код очень сильно упрощен:

public interface IService
{
    IList<Disease> getDiseases();
}

public class Service : IService
{
    private INHibernateHelper NHibernateHelper;
    private IDAOFactory DAOFactory;

    public Service(INHibernateHelper NHibernateHelper, IDAOFactory DAOFactory)
    {
        this.NHibernateHelper = NHibernateHelper;
        this.DAOFactory = DAOFactory;
    }

    public IList<Disease> getDiseases()
    {
        return DAOFactory.getDiseaseDAO().FindAll();
    }
}

public class NHibernateHelper : INHibernateHelper
{
    private static ISessionFactory sessionFactory;

    /// <summary>
    /// SessionFactory is static because it is expensive to create and is therefore at application scope.
    /// The property exists to provide 'instantiate on first use' behaviour.
    /// </summary>
    private static ISessionFactory SessionFactory
    {
        get
        {
            if (sessionFactory == null)
            {
                try
                {
                    sessionFactory = new Configuration().Configure().AddAssembly("Bla").BuildSessionFactory();
                }
                catch (Exception e)
                {
                    throw new Exception("NHibernate initialization failed.", e);
                }
            }
            return sessionFactory;
        }
    }

    public static ISession GetCurrentSession()
    {
        if (!CurrentSessionContext.HasBind(SessionFactory))
        {
            CurrentSessionContext.Bind(SessionFactory.OpenSession());
        }
        return SessionFactory.GetCurrentSession();
    }

    public static void DisposeSession()
    {
        var session = GetCurrentSession();
        session.Close();
        session.Dispose();
    }

    public static void BeginTransaction()
    {
        GetCurrentSession().BeginTransaction();
    }

    public static void CommitTransaction()
    {
        var session = GetCurrentSession();
        if (session.Transaction.IsActive)
            session.Transaction.Commit();
    }

    public static void RollbackTransaction()
    {
        var session = GetCurrentSession();
        if (session.Transaction.IsActive)
            session.Transaction.Rollback();
    }
}

В конце дня я просто хочу показать IService ASP.NET MVC / Консольное приложение / Winform. Я уже могу использовать Сервис в консольном приложении, но сначала хотел бы улучшить его. Полагаю, что первым улучшением было бы внедрение интерфейсов INHibernateHelper и IDAOFactory через замок. Но я думаю, что проблема в том, что NHibernateHelper может вызвать проблемы в контексте asp.net, где NHibernateHelper должен работать в соответствии с шаблоном «Сеанс Nhibernate на запрос». У меня один вопрос: определяется ли этот шаблон в разделе конфигурации nhibernate (настройка current_session_context_class = web) или я могу каким-то образом управлять этим через замок?

Надеюсь, это имеет смысл. Конечная цель - просто разоблачить услугу.

Спасибо.

Christian

1 Ответ

0 голосов
/ 04 марта 2010

У вас есть два варианта ..

1) Разместите его в WCF. Это позволяет вам получить доступ из любого источника.

2) Абстрагируйте все, что конкретно относится к тому, как используется код. Например, в нашей системе мы используем собственную реализацию Unit Of Work, которая хранится по-разному в зависимости от того, где выполняется код. Небольшим примером будет сохранение чего-либо с использованием контекста вызова WCF по сравнению с текущим потоком.

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