我正在做一个项目,我有多个存储库来从不同的表中获取数据。我所有的存储库都是独立的,它们创建新的 dataContext,将行添加到表并应用提交更改命令。现在,如果在我的服务中,有一种情况是我必须将数据插入到多个表中,但它应该发生在一个事务中。我可以使用 TrnasctionScope 的东西来实现,但这需要相同的 dataContext。由于我使用 StrucutreMap 创建对象,我无法获得相同的数据上下文,因此我的事务失败。
这是我的对象的样子。
interface IConnection
{
MyDataContext GetContext();
}
public class Connection : IConnection
{
public MyDataContext GetContext()
{
return new MyDataContext();
}
}
interface IRepositryA
{
int SaveDataA(objectA a);
}
public class RepositoryA : IRepositryA
{
public int SaveDataA(objectA a)
{
var context = objectFactory.GetInstance<IConnection>().GetContext();
context.TableA.InsertOnSubmit(a);
context.SubmitChanges();
return a.ID;
}
}
interface IRepositryB
{
int SaveDataA(objectB b);
}
public class RepositoryA : IRepositryB
{
public int SaveDataB(objectB b)
{
var context = objectFactory.GetInstance<IConnection>().GetContext();
context.TableB.InsertOnSubmit(b);
context.SubmitChanges();
return b.ID;
}
}
现在在我的服务层中,我将它们称为
public MyServiceClass ()
{
public SaveAll(ObjectA a, ObjectB b)
{
using (TransactionScope trn);
{
ObjectFactory.GetInstance<IRepositryA>().SaveDataA(a);
b.FkeyID = a.ID;
ObjectFactory.GetInstance<IRepositryB>().SaveDataB(b);
trn.complete();
}
}
}
我如何将相同的数据上下文传递给两个不同的存储库。我选择,我认为是在每个存储库中创建一个接受 IDataContext 参数的重载方法,如下所示。
interface IRepositryA
{
int SaveDataA(objectA a);
int SaveDataA(IConnection connection, objectA a);
}
public class RepositoryA : IRepositryA
{
public int SaveDataA(objectA a)
{
var connection = objectFactory.GetInstance<IConnection>();
return SaveData(connection, a);
}
public int SaveDataA(IConnection connection, objectA a)
{
var context = connection.GetContext();
context.TableA.InsertOnSubmit(a);
context.SubmitChanges();
return a.ID;
}
}
interface IRepositryB
{
int SaveDataA(objectB b);
int SaveDataA(IConnection connection, objectB b);
}
public class RepositoryA : IRepositryB
{
public int SaveDataB(objectB b)
{
var connection = objectFactory.GetInstance<IConnection>();
return SaveData(connection, b);
}
public int SaveDataA(IConnection connection, objectB b)
{
var context = connection.GetContext();
context.TableB.InsertOnSubmit(b);
context.SubmitChanges();
return b.ID;
}
}
在我的服务层中,我会将其实现为
public MyServiceClass ()
{
public SaveAll(ObjectA a, ObjectB b)
{
IConnection connection= ObjectFactory.GetInstance<IConnection>();
using (TransactionScope trn);
{
ObjectFactory.GetInstance<IRepositryA>().SaveDataA(connection,a);
b.FkeyID = a.ID;
ObjectFactory.GetInstance<IRepositryB>().SaveDataB(connection,b);
trn.complete();
}
}
}
我的第二个想法是,如果我可以以某种方式配置 DataContext 以在调用 GetContext 方法时返回相同的连接。因此所有存储库都将使用相同的连接。但我觉得这会一直保持联系。我希望此连接仅在此 SaveAll 方法期间可用。
你的帮助将得到回报。提前致谢。
干杯帕尔曼德