因此,我现在正在编写一个使用MySQL作为数据库系统的相当复杂的C#应用程序。我想知道,在整个程序中使用MySQL的最佳方式是什么?创建静态函数,以便您可以在任何地方使用它?引用SQLHandler类,它完成了所有的通信?
谢谢!
发布于 2012-12-09 01:01:29
我将抽象接口中的数据访问函数,该接口可以充当数据访问层。然后有一个使用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"))
};
}
}
}
}现在,需要使用wit产品的应用程序的每一层都可以简单地将IProductRepository作为构造函数参数,并调用各种CRUD方法。
它只在您的应用程序的composition root中连接依赖项并指定您将使用MySQLProductRepository。理想情况下,这个存储库的实例应该是单例的。
您还可以查看流行的ORMS,如NHibernate、实体框架、Dapper等。简化存储库中各种CRUD操作的实现,并执行到域模型的映射。但是,即使您决定使用ORM框架,在您的应用程序中将关注点分离到不同的层仍然是一个好的实践。在设计复杂的应用程序时,如果您希望它们保持可维护性,这一点非常重要。
发布于 2012-12-09 00:59:15
一个不错的做法是,如果你想让一个连接一直处于活动状态,就创建一个单点MySQLHandler。
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类。
https://stackoverflow.com/questions/13779610
复制相似问题