MySQL基础架构最佳实践

时间:2012-12-08 16:54:03

标签: c# mysql

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

谢谢!

2 个答案:

答案 0 :(得分:2)

我会在一个可以充当数据访问层的接口内抽象数据访问函数。然后有一个使用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作为构造函数参数并调用各种CRUD方法。

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

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

答案 1 :(得分:-1)

如果你想让1个连接一直处于活动状态,一个好的做法就是制作一个Singelton 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类。