修改
我最终决定:
以上内容应该有效并且易于实施 - 这可能不是最好的方法,并不是问题的直接答案,但必须这样做。
原始问题:
我在项目中使用以下存储库模式接口:
public interface IRepository<T>
{
KeyValuePair<bool, Exception> Create(T entityToAdd);
KeyValuePair<bool, Exception> Create(List<T> entityListToAdd);
KeyValuePair<bool, Exception> CreateOrUpdate(T entity);
KeyValuePair<T, Exception> Get(int entityID);
KeyValuePair<bool, Exception> Update(T entityToUpdate);
KeyValuePair<bool, Exception> Update(List<T> entityListToUpdate);
KeyValuePair<bool, Exception> Delete(int entityID);
KeyValuePair<bool, Exception> Delete(List<int> entityIDs);
KeyValuePair<List<T>, Exception> GetFiltered(Expression<Func<T, bool>> filter);
KeyValuePair<List<T>, Exception> GetFiltered<TOrderBy>(Expression<Func<T, bool>> filter, Expression<Func<T,TOrderBy>> order);
KeyValuePair<T, Exception> GetFilteredSingle(Expression<Func<T, bool>> filter);
KeyValuePair<bool, Exception> UpdateCustomProperty<ValueType>(Expression<Func<T, bool>> filter, Expression<Func<T,ValueType>> property, ValueType value);
}
问题是我设计的方法在成功操作结束时调用了context.SaveChanges(),现在我需要做一些更复杂的事情(在同一个方法中用两个不同的表创建对象),这可能会导致垃圾数据if - 例如 - 创建第一个实体但不创建第二个实体。
我想在我的存储库中添加一个方法,它将方法列表(来自存储库)作为参数 - 因此,我会逐个冷执行它们,并且只有在所有调用都成功时才调用SaveChanges()。
我该怎么办?我尝试搞乱Funct&lt;&gt;但由于它需要固定数量的函数变量才能工作,因此它似乎不适合这项工作。
提前致谢。
最好的问候。
答案 0 :(得分:0)
我会考虑在不同类型之间分配责任。
概念可能如下所示:
public interface IDBSAve {} //generic interface
public class Table1Saver : IDBSave {} //class that saves ONLY in Table1
public class Table2Saver : IDBSave {} //class that saves ONLY in Table2
//business process that requires save in these 2 tables
var twoTablesBusinessProcess = new List<IDBSave> {new Table1Saver(), new Table2saver()};
//execute save in all calling chanin of this business process and if ALL
//succeed, confirm commit.
if(twoTablesBusinessProcess.All(save=>save.SaveTable()))
context.SaveChanges();
我在这里假设从IDBSAve
接口派生的每个类型都实现了bool SaveTable(..)
方法,如果保存suceed则返回true
,否则返回false
。