我一直在阅读委托和传递方法作为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()。
这种模式的任何智能解决方案?
答案 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));
}