所以,我现在正在编写一个相当复杂的 C# 应用程序,它使用 MySQL 作为数据库系统。我想知道,在整个程序中使用 MySQL 的最佳方式是什么?创建静态函数以便您可以在任何地方使用它?引用一个 SQLHandler 类,它完成了所有的通信吗?
谢谢!
我会在一个可以充当数据访问层的接口中抽象出数据访问功能。然后有一个使用 MySQL 的实现。然后始终将接口传递给需要查询数据库的应用程序的其他层。通过这种方式,您可以在这些层之间获得弱耦合,并使这些层隔离的单元测试成为可能。
让我们举个例子。假设您有一个Product
模型:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
现在您可以定义一个存储库,它将抽象您需要使用此模型执行的操作:
public interface IProductRepository
{
Product Get(int id);
}
然后你可以使用 MySQL 来实现这个接口:
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
as 构造函数参数并调用各种 CRUD 方法。
它仅在应用程序的组合根内部,您可以在其中连接依赖项并指定您将使用MySQLProductRepository
. 理想情况下,此存储库的实例应该是单例。
您还可以查看流行的 ORMS,例如 NHibernate、Entity Framework、Dapper 等,以简化存储库中各种 CRUD 操作的实现并执行到域模型的映射。但是,即使您决定使用 ORM 框架,将关注点分成应用程序中的不同层仍然是一种很好的做法。如果您希望它们保持可维护性,这在设计复杂的应用程序时非常重要。
MySQLHandler
如果您想始终保持 1 个连接处于活动状态,则一个好的做法是创建一个 Singelton 。
using System;
public class MySQLHandler
{
private static MySQLHandler instance;
private MySQLHandler() {}
public static MySQLHandler Instance
{
get
{
if (instance == null)
{
instance = new MySQLHandler();
}
return instance;
}
}
}
如果您不关心连接数,您也可以创建一个静态MySQLHelper
类。