Шаблон репозитория, совместное использование соединений - PullRequest
4 голосов
/ 09 июля 2009

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

Основная причина, по которой я спрашиваю, заключается в том, что при создании транзакции с использованием 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)
}

Ответы [ 2 ]

5 голосов
/ 09 июля 2009

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

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

1 голос
/ 12 октября 2011

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

Итак, подумайте, если у вас есть две базы данных: база данных 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();
}
...