存储库模式,共享连接

时间:2009-07-09 08:43:29

标签: c# .net ado.net repository-pattern

我找到了很多存储库模式的例子,所有这些都展示了存储库管理它自己的连接生命周期。我想知道人们如何处理他们希望在多个存储库之间共享单个连接的情况?

我问的主要原因是因为当我使用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 个答案:

答案 0 :(得分:5)

创建存储库时,我会在存储库的构造函数中传递我想要使用的connection / unitofwork / ISession(nhibernate)。

存储库不应该负责创建连接/ ISession本身,因为存储库不知道将使用它的上下文。 您也可以选择使用像Castle或Spring.NET这样的控件容器的反转。

答案 1 :(得分:1)

我为每个我需要的数据库连接创建了会话工厂类。

因此,请考虑您是否有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();
}