Шаблон репозитория, совместное использование соединений

Я нашел множество примеров шаблона репозитория, каждый из которых показывает репозиторий, управляющий собственным жизненным циклом соединения. Мне было интересно, как люди справляются со случаем, когда они хотят использовать одно соединение для нескольких репозиториев?

Основная причина, по которой я спрашиваю, заключается в том, что когда я создаю транзакцию с помощью TransactionScope, я действительно не хочу, чтобы она трансформировалась в транзакцию DTC. Он кажется немного тяжеловесным, хотя и простым в настройке.

Я думал об использовании чего-то похожего на TransactionScope, который будет управлять жизненным циклом соединения. Однако кажется, что это мало увязывает доступ к данным с бизнес-процессом. Пример того, что я имею в виду:

//As DataScope will handle connections, then repositories will be created from them
//in order to share the connection.
using(DataScope scope = new DataScope())
{
   scope.GetRepository<CustomerRepository>.FindById(10)
}

person spooner    schedule 09.07.2009    source источник


Ответы (2)


При создании репозитория я передаю соединение /unitofwork/ISession(nhibernate), которое хочу использовать, в конструктор репозитория.

Репозиторий не должен нести ответственность за создание самого соединения/ISession, так как репозиторий не знает контекста, в котором оно будет использоваться. Вы также можете выбрать использование инверсии контейнера управления, такого как Castle или Spring.NET.

person Frederik Gheysels    schedule 09.07.2009
comment
Не могли бы вы привести пример вашего класса UnitOfWork? Что мне нужно знать, так это то, как выполнять разные методы разных репозиториев в рамках одной и той же транзакции. - person eddy; 18.10.2016
comment
Мой UnitOfWork в основном является оболочкой для NHibernate ISession или Entity Framework DbContext. (Старый) пример можно найти здесь: fgheysels.blogspot.be/ 2008/07/ - person Frederik Gheysels; 18.10.2016

Я создал класс фабрики сеансов для каждого соединения с базой данных, которое мне нужно.

Поэтому подумайте, если у вас есть 2 базы данных: база данных Backoffice и база данных Checkout, моя фабрика сеансов будет выглядеть следующим образом:

public class BackOfficeSessionFactoryCreator : ISessionFactoryCreator
{
    public ISessionFactory CreateSessionFactory()
    {
        var sessionFactory =Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager
        .AppSettings["FluentNHibernateConnectionForBackOffice"]))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Customer>())
        .ExposeConfiguration(c => c.SetProperty("command_timeout",ConfigurationManager
        .AppSettings["FluentNHibernateCommandTimeout"]));

        return sessionFactory.BuildSessionFactory();
    }
}



public class CheckoutSessionFactoryCreator : ISessionFactoryCreator
{
    public ISessionFactory CreateSessionFactory()
    {
        var sessionFactory =Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager
        .AppSettings["FluentNHibernateConnectionForCheckout"]))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<CustomerCheckOut>())
        .ExposeConfiguration(c => c.SetProperty("command_timeout",ConfigurationManager
        .AppSettings["FluentNHibernateCommandTimeout"]));

        return sessionFactory.BuildSessionFactory();
    }
}


public interface ISessionFactoryCreator
{
    ISessionFactory CreateSessionFactory();
}
person Praveen D'Souza    schedule 12.10.2011
comment
Хотя это полезно, оно не пытается ответить на вопрос OP. - person Ricardo Souza; 19.06.2015