【问题标题】:Repository pattern, sharing connections存储库模式,共享连接
【发布时间】:2009-07-09 08:43:28
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 你能提供一个你的 UnitOfWork 类的例子吗?我需要知道的是如何在同一个事务中执行不同存储库的不同方法。
    • 我的 UnitOfWork 主要是 NHibernate ISession 或实体框架 DbContext 的包装器。可以在此处找到一个(旧)示例:fgheysels.blogspot.be/2008/07/…
    【解决方案2】:

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

    所以考虑如果你有 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();
    }
    

    【讨论】:

    • 虽然这很有用,但并没有尝试回答OP问题。
    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2011-07-01
    • 2022-08-19
    相关资源
    最近更新 更多