Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储库模式,共享连接_C#_.net_Ado.net_Repository Pattern - Fatal编程技术网

C# 存储库模式,共享连接

C# 存储库模式,共享连接,c#,.net,ado.net,repository-pattern,C#,.net,Ado.net,Repository Pattern,我发现了许多存储库模式的示例,所有这些示例都显示了存储库管理自己的连接生命周期。我想知道人们是如何处理他们希望在多个存储库之间共享单个连接的情况的 我问这个问题的主要原因是,当我使用TransactionScope创建一个事务时,我真的不希望它升级为DTC事务。它看起来有点重,尽管安装起来很简单 我当时的想法是使用类似于TransactionScope的东西来管理连接生命周期。然而,似乎有点将数据访问与业务流程联系起来了。我的意思的一个例子是: //As DataScope will handl

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

我问这个问题的主要原因是,当我使用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)
}
//由于DataScope将处理连接,因此将从这些连接创建存储库
//以共享连接。
使用(DataScope scope=newdatascope())
{
scope.GetRepository.FindById(10)
}

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

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

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

请考虑如果你有2个数据库:后台数据库和结帐数据库,我的会话工厂看起来如下:

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();
}
公共类BackOfficeSessionFactoryCreator:ISessionFactoryCreator
{
公共ISessionFactory CreateSessionFactory()
{
var sessionFactory=fluntly.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager
.AppSettings[“用于后台的FluentNHibernateConnection”])
.Mappings(m=>m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(c=>c.SetProperty(“命令超时”),ConfigurationManager
.AppSettings[“FluentNHibernateCommandTimeout”]);
返回sessionFactory.BuildSessionFactory();
}
}
公共类CheckoutSessionFactoryCreator:ISessionFactoryCreator
{
公共ISessionFactory CreateSessionFactory()
{
var sessionFactory=fluntly.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager
.AppSettings[“FluentNHibernateConnectionForCheckout”])
.Mappings(m=>m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(c=>c.SetProperty(“命令超时”),ConfigurationManager
.AppSettings[“FluentNHibernateCommandTimeout”]);
返回sessionFactory.BuildSessionFactory();
}
}
公共接口ISessionFactoryCreator
{
ISessionFactory CreateSessionFactory();
}

虽然这很有用,但它不会试图回答OP问题。您能提供一个UnitOfWork类的示例吗?我需要知道的是如何在同一事务中执行不同存储库的不同方法。可以在此处找到一个(旧)示例: