C# MySQL基础架构最佳实践

C# MySQL基础架构最佳实践,c#,mysql,C#,Mysql,因此,我现在正在编写一个相当复杂的C#应用程序,它使用MySQL作为数据库系统。我想知道,在整个程序中使用MySQL的最佳方式是什么?创建静态函数以便可以在任何地方使用它?引用一个SQLHandler类,它完成所有的通信 谢谢 如果您希望保持1个连接始终处于活动状态,那么一个好的做法是创建一个SingletonMySQLHandler using System; public class MySQLHandler { private static MySQLHandler instanc

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


谢谢

如果您希望保持1个连接始终处于活动状态,那么一个好的做法是创建一个Singleton
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
类。

如果你想让一个连接始终保持活动状态,一个好的做法是创建一个singleton
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
类。

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

让我们举个例子。假设您有一个
产品
型号:

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"))
                };
            }
        }
    }
}
现在,需要与产品协同工作的应用程序的每一层都可以简单地将
ipProductRepository
作为构造函数参数,并调用各种CRUD方法

只有在应用程序的内部,您才能连接依赖项并指定使用
MySQLProductRepository
。理想情况下,该存储库的实例应该是单实例


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

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

让我们举个例子。假设您有一个
产品
型号:

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"))
                };
            }
        }
    }
}
现在,需要与产品协同工作的应用程序的每一层都可以简单地将
ipProductRepository
作为构造函数参数,并调用各种CRUD方法

只有在应用程序的内部,您才能连接依赖项并指定使用
MySQLProductRepository
。理想情况下,该存储库的实例应该是单实例


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

我只是默默地将MVC扔进房间(),你应该仔细查看以隔离数据访问层,可能还应该远离静态方法。我只是默默地将MVC扔进房间(),你应该仔细查看以隔离数据访问层,并且可能远离静态方法。感谢您的精彩解释!谢谢你的解释!