Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 好看的代码(与作为参数传递方法有关)_C#_Design Patterns - Fatal编程技术网

C# 好看的代码(与作为参数传递方法有关)

C# 好看的代码(与作为参数传递方法有关),c#,design-patterns,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

我一直在阅读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);
   }
}
public static T GetSingleItem(字符串查询,参数对象[]args),其中T:new()
{
使用(var db=new-SQLiteConnection(DbPath))
{
db.Trace=true;
返回db.Query(Query,args).FirstOrDefault();
}
}
公共静态列表GetItems(字符串查询,参数对象[]args),其中T:new()
{
使用(var db=new-SQLiteConnection(DbPath))
{
db.Trace=true;
返回db.Query(Query,args);
}
}
公共静态空白插入(对象obj)
{
使用(var db=new-SQLiteConnection(DbPath))
{
db.Trace=true;
db.插入(obj);
}
}
公共静态无效更新(对象obj)
{
使用(var db=new-SQLiteConnection(DbPath))
{
db.Trace=true;
数据库更新(obj);
}
}
有没有一种方法可以将using语句和db.Trace封装在一个方法中,然后从它们的特定方法调用methodcontent的其余部分,例如db.Update(obj)

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

public static T Runner<T>(Func<T> funcToRun)
publicstatict运行程序(Func funcToRun)
就是从using语句实例化的对象调用db.Update()


这个模式有什么聪明的解决方案吗?

我并不是说这是重构它的最佳方式,但你的想法几乎达到了目的,我只是扩展了它

我相信,但我不确定,这可能被称为模板方法模式(但我发现这方面的示例不使用
Func
,它们使用虚拟方法和派生类,但概念是相同的)

你需要一个空的:

public static void RunAction(Action<SQLiteConnection> actionToRun)
{
    using (var db = new SQLiteConnection(DbPath))
    {
        db.Trace = true;
        actionToRun(db);
   }
}
调用返回的
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));
}
公共静态列表GetItems(字符串查询,参数对象[]args),其中T:new()
{
返回RunFunc(db=>db.Query(Query,args));
}
感谢您的快速回复。我没有将db作为参数传递。代码运行流畅,除了db.Query中的一个小细节。非常感谢:)
public static void Update(object obj)
{
    RunAction(db => db.Update(obj));
}
public static List<T> GetItems<T>(string query, params object[] args) where T : new()
{
    return RunFunc<List<T>>(db => db.Query<T>(query, args));
}