首页 > 解决方案 > 使用 DynamicParameters 从 Sqlite 查询中获取接口类型

问题描述

我有一个实现接口的模型类如下;

public class EngTrModel : IWordModel
    {
        public string Word { get; set; }
        public string Translation { get; set; }
        public string WordPair
        {
            get
            {
                return $"{Word}->{Translation}";
            }
        }
    }

我有一个处理器类,负责连接到 Sqlite 数据库并获取以下所有行;

public class SqliteDataAccess : IDataAccess
{
    public static string LoadConnectionString(string id = "Default")
    {
        return ConfigurationManager.ConnectionStrings[id].ConnectionString;
    }
    public static List<EngTrModel> LoadDatabase()
    {
        using (IDbConnection conn = new SQLiteConnection(LoadConnectionString()))
        {
            var output = conn.Query<EngTrModel>("Select * from Words", new DynamicParameters());
            return output.ToList();
        }
    }
}

在我的 WPF 表单代码中,当我单击“加载记录”按钮时,它可以正常工作并将表行加载到列表框中,如下所示;

private void loadFromDatabase_Click(object sender, RoutedEventArgs e)
{
    LoadFromDatabase(SqliteDataAccess.LoadDatabase());
}

private void LoadFromDatabase(List<EngTrModel> words)
{
    WordsListBox.ItemsSource = null;
    WordsListBox.ItemsSource = words;
    WordsListBox.DisplayMemberPath = "WordPair";
}

将来当我扩展我的应用程序以支持其他语言时,例如当我需要将实现 IWordModel 接口的 EngFrModel 添加到我的应用程序中时,我希望能够在不更改任何内容的情况下使用“LoadFromDatabase”方法(开放封闭原则)。我做了一些尝试,但都没有工作;例如,我想使用以下方法而不是硬编码值,并赋予该方法处理不同类型模型和数据库表的功​​能;

public static List<IWordModel> LoadDatabase(string table)
{
    using (IDbConnection conn = new SQLiteConnection(LoadConnectionString()))
    {
        var output = conn.Query<IWordModel>($"Select * from {table}", new DynamicParameters());
        return output.ToList();
    }
}

然后我做了以下更改;

private void loadFromDatabase_Click(object sender, RoutedEventArgs e)
{
    LoadFromDatabase(SqliteDataAccess.LoadDatabase("Words"));
}

private void LoadFromDatabase(List<IWordModel> words)
{
    WordsListBox.ItemsSource = null;
    //WordsListBox.ItemsSource = DataAccess.LoadDatabase();
    WordsListBox.ItemsSource = words;
    WordsListBox.DisplayMemberPath = "WordPair";
}

该代码可以无错误地编译,但它给出 System.ArgumentException:'DynamicMethod 的类型所有者无效。' 以下代码行中的错误;

 var output = conn.Query<IWordModel>($"Select * from {table}", new DynamicParameters());

标签: c#sqlitedesign-principles

解决方案


推荐阅读