是否有可能在接口中创建一个方法,该方法将该接口的方法列表作为参数?

时间:2014-03-06 09:00:20

标签: c# interface repository-pattern

修改

我最终决定:

  1. 将SaveChanges()方法添加到我的存储库,并使保存更改可选。
  2. 在我的控制器方法中使用TransactionScope和SaveChanges
  3. 以上内容应该有效并且易于实施 - 这可能不是最好的方法,并不是问题的直接答案,但必须这样做。

    原始问题:

    我在项目中使用以下存储库模式接口:

    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;但由于它需要固定数量的函数变量才能工作,因此它似乎不适合这项工作。

    提前致谢。

    最好的问候。

1 个答案:

答案 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