asp.net MVC - 如何通过不同的存储库类共享同一个SqlConnection实例

时间:2016-10-11 22:08:01

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

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

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

虽然这看起来似乎是最简单的方法,但我并不是它的忠实粉丝,所以我想知道的是,我是否可以使用任何方式/通用实践来共享为其创建的SqlConnection的相同实例父对象与其他相关对象?

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

修改

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

这是父对象(Model)的存储库,我认为应该实例化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,但我不确定在我的情况下哪一个是正确的。

1 个答案:

答案 0 :(得分:0)

我不确定你为什么要分享'一个连接。回到基础,你应该总是在using块中封装连接(假设你使用EF)。

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

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

TransactionInfo可以有一个构造函数,如:

TransactionInfo

我希望我能理解你。分享public TransactionInfo(Action action, ICrudRepository repository) 对我来说似乎是错的。