【问题标题】:asp.net MVC - How can I share the same instance of a SqlConnection through different repository classesasp.net MVC - 如何通过不同的存储库类共享 SqlConnection 的相同实例
【发布时间】:2017-02-20 14:29:14
【问题描述】:

我正在使用 MVC5 和普通 ADO.NET 创建一个新项目(只是作为一个学习练习),我需要创建一个存储库,该存储库注册一个包含多个相关对象的模型,这些对象也需要同时创建,并且这些对象又可能需要插入其他对象。

我能想到的最简单的解决方案是有一个庞大的方法(在存储库中)接收父对象的实例(其中包含需要插入的所有相关对象),并且还有一个存储过程接收所有相关数据作为表值参数,然后使用单个事务插入所有内容。

虽然这似乎是最直接的方法,但我不是它的忠实粉丝,所以我想知道是否有任何方法/常见做法可以用来共享为 SqlConnection 创建的同一个实例与其他相关对象的父对象?

我在想也许在相关对象的构造函数中传递 SqlConnection 对象,这样每个存储库只需要处理插入单个对象的逻辑,但我不确定。

编辑

-------------------

这是父对象(模型)的存储库,我认为应该实例化 SqlConnection 并启动事务

 public class ModelRepository : IModelRepository
    {
        public int Add(Model entity)
        {
            using (var conn = new SqlConnection(ConnectionString))
            {   
                conn.Open();
                using (var command = conn.CreateCommand())
                {                    
                    command.Transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted);
                    command.CommandText = "up_Model_Insert";
                    command.CommandType = CommandType.StoredProcedure;                 
                    

                    command.Parameters.Add(command.CreateParameter("@pName ", entity.Name));
                    command.Parameters.Add(command.CreateParameter("@pDescription", entity.Description));
                    //Other parameters...

                    //Call the repositories of the other objects

                    //....

                    //how can I make the other repositories use the same connection and 
                    //transaction as the Model entity?


                    

                    
                    return Convert.ToInt32(command.ExecuteScalar());
                }
            }
        }
    }

问题是我不知道如何让其他存储库使用与“模型”实体相同的连接和事务。

我读过 Ninject 有这个 "object scope" concept ,但我不确定在我的情况下哪个是正确的。

【问题讨论】:

  • 你研究过 IoC 吗?它与 MVC 配合得非常好,在你的情况下可能是依赖注入的理想选择。 Here 是一篇对 IoC 和 MVC 有帮助的好文章:
  • @skar 目前我正在使用 Ninject,我认为它被称为构造函数依赖注入模式。这种模式的问题在于,据我所知,它是这样的:每当我需要一个类 X 的新实例时,就去实例化它的所有依赖项,而对于这个特定的场景,这不是我所需要的,因为将是 SqlConnection 类的几个实例。
  • 您应该能够将 SqlConnection 类注册为针对您的 IoC 容器的单例,这将允许您一次实例化 SqlConnection 类并在需要时使用相同的实例。
  • @skar 请参阅我的问题中的编辑部分。

标签: c# asp.net-mvc dependency-injection asp.net-mvc-5 repository-pattern


【解决方案1】:

我不确定您为什么要“共享”连接。回到基础,您应该始终将连接封装在 using 块中(假设您使用 EF)。

你追求的是交易,对吧?我现在只是在想我的头: 您可以做的是将您的插入逻辑包装在 TransactionInfo 类中。这些TransactionInfo 类可以将Action 和存储库作为参数。该操作最终执行通过给定存储库插入单个对象的逻辑(存储库应遵循为您提供 CRUD 逻辑的某些接口)。

当您有多个TransactionInfo 时,您可以将它们一起发送到某个地方,以执行开始database transaction 的逻辑,从每个TransactionInfo 对象执行所有给定的Actions,并最终执行事务。

TransactionInfo 可以有这样的构造函数:

public TransactionInfo(Action action, ICrudRepository repository)

我希望我已经很好地理解了你。分享SqlConnection 对我来说似乎是错误的。

【讨论】:

  • 请参阅我的问题中的编辑部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2012-08-20
相关资源
最近更新 更多