c# - MySQL 基础架构最佳实践

标签 c# mysql

所以,我现在正在编写一个相当复杂的 C# 应用程序,它使用 MySQL 作为数据库系统。我想知道,在整个程序中使用 MySQL 的最佳方式是什么?创建静态函数以便可以在任何地方使用它?引用执行所有通信的 SQLHandler 类?

谢谢!

最佳答案

我会抽象出一个接口(interface)内的数据访问函数,该接口(interface)可以充当数据访问层。然后有一个使用 MySQL 的实现。然后始终将接口(interface)传递给需要查询数据库的应用程序的其他层。通过这种方式,您可以在这些层之间获得弱耦合,并使隔离这些层的单元测试成为可能。

让我们举个例子。假设您有一个 Product 模型:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

现在您可以定义一个存储库,它将抽象化您需要使用此模型执行的操作:

public interface IProductRepository
{
    Product Get(int id);
}

然后您可以使用 MySQL 实现此接口(interface):

public class MySQLProductRepository: IProductRepository
{
    private readonly string _connectionString;
    public MySQLProductRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public Product Get(int id)
    {
        using (var conn = new MySqlConnection(_connectionString))
        using (var cmd = conn.CreateCommand())
        {
            conn.Open();
            cmd.CommandText = "SELECT name FROM products WHERE id = @id";
            cmd.Parameters.AddWithValue("@id", id);
            using (var reader = cmd.ExecuteReader())
            {
                if (!reader.Read())
                {
                    return null;
                }

                return new Product
                {
                    Id = id,
                    Name = reader.GetString(reader.GetOrdinal("name"))
                };
            }
        }
    }
}

现在,您的应用程序中需要与产品打交道的每一层都可以简单地将 IProductRepository 作为构造函数参数并调用各种 CRUD 方法。

它只在composition root里面您的应用程序,您将在其中连接依赖项并指定您将使用 MySQLProductRepository。理想情况下,此存储库的实例应该是单例。

您还可以检查 NHibernate、Entity Framework、Dapper 等流行的 ORMS,以简化存储库中各种 CRUD 操作的实现并执行到域模型的映射。但是,即使您决定使用 ORM 框架,将关注点分离到应用程序中的不同层仍然是一种很好的做法。如果您希望它们保持可维护性,那么在设计复杂的应用程序时,这一点非常重要。

关于c# - MySQL 基础架构最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13779610/

相关文章:

c# - MySql 引用

mysql - 在 MySQL 中将字符串转换为十进制的问题

mysql - 删除MySQL中的重复组合

c# - 如何在 .Net Web Api 上记录每个方法的执行时间和参数

c# - 所有的 c# 类都应该实现 Equals 和 GetHashCode 吗?

php - 如何在 Laravel Eloquent 中移动行?

MYSQL SELECT - 如果 x > 100 则 x=100

php - 总登录时间

c# - 结构相等性如何与 Int32 一起使用?

c# - 如何在具有指定数据源的 DataGridView 中启用排序?