首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL基础架构最佳实践

MySQL基础架构最佳实践
EN

Stack Overflow用户
提问于 2012-12-09 00:54:03
回答 2查看 2.4K关注 0票数 1

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-09 01:01:29

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

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

代码语言:javascript
复制
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

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

代码语言:javascript
复制
public interface IProductRepository
{
    Product Get(int id);
}

然后,您可以使用MySQL实现此接口:

代码语言:javascript
复制
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框架,在您的应用程序中将关注点分离到不同的层仍然是一个好的实践。在设计复杂的应用程序时,如果您希望它们保持可维护性,这一点非常重要。

票数 2
EN

Stack Overflow用户

发布于 2012-12-09 00:59:15

一个不错的做法是,如果你想让一个连接一直处于活动状态,就创建一个单点MySQLHandler

代码语言:javascript
复制
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类。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13779610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档