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

我正在创建一个使用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有这个“对象范围”的概念 ,但我不确定在我的情况下哪一个是正确的。

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

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

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

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

 public TransactionInfo(Action action, ICrudRepository repository) 

我希望我能理解你。 共享一个SqlConnection对我来说似乎是错的。