代码之家  ›  专栏  ›  技术社区  ›  Liam Kernighan

我的所有方法都需要一个通用包装器,而不需要重复代码(C#)

c#
  •  1
  • Liam Kernighan  · 技术社区  · 7 年前

    我有一个函数

    public TOut PerformDbOperation<TIn, TOut>(Func<IDbConnection, TIn, TOut> method, TIn param1, bool withinTransaction)
    {
        IDbConnection db = GetNewDbConnection();
        OpenConnection(db);
        IDbTransaction transaction = null;
    
        if (withinTransaction) {
            transaction = db.BeginTransaction();
        }
    
        try {
            TOut result = method(db, param1);
            if (withinTransaction) {
                transaction.Commit();
            }
            return result;
    
        }
        finally {
            if (withinTransaction) {
                transaction.Dispose();
            }
            CloseConnection(db);
        }
    }
    

    3 回复  |  直到 7 年前
        1
  •  1
  •   Abdou    7 年前

    试试这个:

    public TOut PerformDbOperation<TOut>(Function<IDbConnection,TOut> method, bool withinTransaction)
    {
        IDbConnection db = GetNewDbConnection();
        OpenConnection(db);
        IDbTransaction transaction = null;
    
        if (withinTransaction) {
            transaction = db.BeginTransaction();
        }
    
        try {
            TOut result = method(db);
            if (withinTransaction) {
                transaction.Commit();
            }
            return result;
    
        }
        finally {
            if (withinTransaction) {
                transaction.Dispose();
            }
            CloseConnection(db);
        }
    }
    

    string s = PerformDbOperation((db) => yourMethode(db, param1, param2, param3));
    

    如果您还需要传递不返回任何内容的methode,请使用 Action<IDbConnection> 而不是 Function<IDbConnection,TOut>

    public void PerformDbOperation(Action<IDbConnection> method, bool withinTransaction)
    {
         PerformDbOperation((db) => 
         {
              method(db);
              return 0;
         } 
         ,withinTransaction);  //this will call the other overload thanks to the 'return 0' stamtement
    }
    
        2
  •  2
  •   Olivier Jacot-Descombes    6 年前

    你可以使用命令模式。

    public interface IDbOperation<out TResult>
    {
        TResult Result { get; }
        void Execute(IDbConnection connection);
    }
    

    实现此接口的类可以通过构造函数传递参数

    public Class1 : IDbOperation<string>
    {
        public Class1(int param1, double param2)
        {
            ...
        }
    
        public string Result { get; private set; }
    
        public void Execute(IDbConnection connection)
        {
            ...
            Result = ...;
        }
    }
    
    public Class2 : IDbOperation<int>
    {
        public Class2(Person person)
        {
            ...
        }
    
        public int Result { get; private set; }
    
        public void Execute(IDbConnection connection)
        {
            ...
            Result = ...;
        }
    }
    

    public TOut PerformDbOperation<TOut>(IDbOperation<TOut> operation, bool withinTransaction)
    {
        IDbConnection db = GetNewDbConnection();
        OpenConnection(db);
        IDbTransaction transaction = null;
    
        if (withinTransaction) {
            transaction = db.BeginTransaction();
        }
    
        try {
            operation.Execute(db);
            if (withinTransaction) {
                transaction.Commit();
            }
            return operation.Result;
        }
        finally {
            if (withinTransaction) {
                transaction.Dispose();
            }
            CloseConnection(db);
        }
    }
    

    它不需要知道操作的参数。

        3
  •  0
  •   Bruno Warmling    7 年前

    DbConnection 通过应用现有的继承。因此,在本例中,您可以有自己的方法来执行某些内容,在这个方法中,您可以执行继承的方法。