4

我发现了很多存储库模式的示例,所有这些示例都显示存储库管理它自己的连接生命周期。我想知道人们如何处理他们想要跨多个存储库共享单个连接的情况?

我问的主要原因是因为当我使用 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)
}
4

2 回答 2

5

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

存储库不应该负责创建连接/ISession 本身,因为存储库不知道将在其中使用它的上下文。您还可以选择使用控制容器的反转,例如 Castle 或 Spring.NET。

于 2009-07-09T08:49:06.783 回答
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();
}
于 2011-10-12T15:45:18.590 回答