一个好看的代码问题(与传递方法作为参数有关)

时间:2015-04-30 10:05:18

标签: c# design-patterns

我一直在阅读委托和传递方法作为C#中的参数,仅仅因为我的" OCD"我在看这段代码时正在咬我:

 public static T GetSingleItem<T>(string query, params object[] args) where T : new()
{
    using (var db = new SQLiteConnection(DbPath))
    {
        db.Trace = true;
        return db.Query<T>(query, args).FirstOrDefault();
    }
}

public static List<T> GetItems<T>(string query, params object[] args) where T : new()
{
    using (var db = new SQLiteConnection(DbPath))
    {
        db.Trace = true;
        return db.Query<T>(query, args);
    }
}

public static void Insert(object obj)
{
    using (var db = new SQLiteConnection(DbPath))
    {
        db.Trace = true;
        db.Insert(obj);
    }
}

public static void Update(object obj)
{
    using (var db = new SQLiteConnection(DbPath))
    {
        db.Trace = true;
        db.Update(obj);
   }
}

有没有办法在一个方法中封装using语句和db.Trace,然后简单地调用methodcontent的其余部分,例如db.Update(obj)来自他们的具体方法?

将部分方法作为参数传递的明显问题,例如

public static T Runner<T>(Func<T> funcToRun)

我是否正在从using语句实例化的对象中调用db.Update()。

这种模式的任何智能解决方案?

1 个答案:

答案 0 :(得分:3)

我并不是说这是重构它的最佳方法,但你几乎已经有了你的想法,我只是扩展了它。

我相信,但我不确定,这可能被称为模板方法模式(但我发现这个例子并不使用Func,它们使用虚方法和派生类,但概念是一样的。)

你需要一个空虚:

public static void RunAction(Action<SQLiteConnection> actionToRun)
{
    using (var db = new SQLiteConnection(DbPath))
    {
        db.Trace = true;
        actionToRun(db);
   }
}

一个用于返回类型:

public static T RunFunc<T>(Func<SQLiteConnection, T> funcToRun) where T : new()
{
    using (var db = new SQLiteConnection(DbPath))
    {
        db.Trace = true;
        return funcToRun(db);
   }
}

调用空格Action

public static void Update(object obj)
{
    RunAction(db => db.Update(obj));
}

致电回复Func

public static List<T> GetItems<T>(string query, params object[] args) where T : new()
{
    return RunFunc<List<T>>(db => db.Query<T>(query, args));
}