【问题标题】:Three-Tier Architecture Vs Repository Pattern三层架构与存储库模式
【发布时间】:2017-03-24 18:43:55
【问题描述】:

我正在尝试在 ASP.NET MVC 项目中使用三层架构和存储库模式。但在某些情况下,三层架构和存储库模式看起来几乎相同。所以我尝试研究以下内容以使其更清楚:

The Repository Pattern

N-Tier Architecture

在那之后,我进入了以下代码进行实施,并希望得到一些建议,以更有效的方式改进实施:

模型 - 部门类:

public class Department
{
   public int DepartmentID { get; set; }
   public string Code { get; set; }
   public string DepartmentName { get; set; }
}

接口 - IRepository 接口:

public interface IRepository
{
   public int Add(Student aStudent); //For Adding Students
   public int Add(Department aDepartment);  //For Adding Departments
} 

DAL - DepartmentGateway 类:

public class DepartmentGateway : IRepository
{
   /****Repository Pattern - Starts****/
   Gateway aGateway = new Gateway();
   public int Add(Department aDepartment)
   {
      aGateway.Query = "INSERT INTO Departments (Code, Name) VALUES (@Code, @Name)";

      aGateway.Command = new SqlCommand(aGateway.Query, aGateway.Connection);

      aGateway.Connection.Open();

      aGateway.Command.Parameters.Clear();
      aGateway.Command.Parameters.Add("Code", SqlDbType.NVarChar);
      aGateway.Command.Parameters["Code"].Value = aDepartment.Code;
      aGateway.Command.Parameters.Add("Name", SqlDbType.NVarChar);
      aGateway.Command.Parameters["Name"].Value = aDepartment.DepartmentName;

      int rowAffected = aGateway.Command.ExecuteNonQuery();

      aGateway.Connection.Close();

      return rowAffected;
   }
   /****Repository Pattern - Ends****/
}

BLL - DepartmentManager 类:

public class DepartmentManager
{
   DepartmentGateway aDepartmentGateway = new DepartmentGateway();

   public int Add(Department aDepartment)
   {
      int affect = aDepartmentGateway.Add(aDepartment);

      if (affect > 0)
      {
         return 1;
      }
      else
      {
         return 0;
      }
   }
}

我要离开 UI 部分。我试图确保这是否是正确的方法并让我知道。谢谢。

注意:我很抱歉提出这个问题。我实际上将这两件事混合在一起,并希望专家提供一些带有代码示例的建议。请不要发布任何链接。我已经看过一些了。

【问题讨论】:

  • 你没有使用 ORM 吗?
  • 你好@Div!暂时没有。它处于测试模式,稍后将迁移到 ORM。

标签: sql asp.net-mvc repository-pattern three-tier


【解决方案1】:

N-Tier 和存储库模式并不矛盾。事实上,他们真的没有任何关系。 N-Tier 只是一种理念,即您的应用程序应该分层构建。它本质上是关于模块化的。存储库模式是关于抽象的,即从应用程序代码中抽象出 SQL 查询。您可以很好地在同一个应用程序中两者。

但是,围绕存储库模式存在很多争论。它早于 ORM,并且有一个强有力的论据认为它与 ORM 是多余的。例如,对于 Entity Framework,DbContext 是您的工作单元,每个 DbSet 都是一个存储库。此时您应该在这里使用的实际上是一种策略模式。您需要一些代表您的数据访问的接口,稍后您将使用一个实现(您的 ORM)来填充它。不过,这真的不会对您的代码产生太大影响,因此它主要是语义。请记住,您可能实际上并不想要一个“存储库”,并且您绝对不应该构建您的应用程序,就好像您将拥有每个实体或类似的这些实现之一。

【讨论】:

  • 那么您的意思是使用 ORM 来实现存储库模式?策略模式似乎是一种新模式。没关系。最后一个问题 - 我上面编写的代码对存储库模式有什么影响或完善吗?只是想确认一下。
  • 没有。我是说 ORM 满足存储库模式。策略模式只是一种抽象,它允许您为一个功能划分不同的“策略”。换句话说,您使用一个接口和针对该接口的代码。稍后您可以注入该接口的实现。例如,在这种情况下,您可能有一个实体框架实现、一个 Web Api 实现等。您的应用程序只知道它正在调用接口上的方法。在实现中,您决定如何检索数据。
  • 虽然不使用ORM来开始你的应用程序实际上有点倒退。具有讽刺意味的是,根据您当前获取数据的方式,您可能应该拥有一个工作单元和一个或多个存储库。那是因为您希望所有这些逻辑都封装在应用程序代码之外的某个地方。然而,一旦你引入了 ORM,那就没有必要了。
  • 我将尝试尽快迁移到 ORM (EF),因为它似乎非常重要。感谢您花时间浏览它。所以你说我上面写的代码对存储库模式几乎是语义的,但使用 ORM 会更好。
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 2011-06-02
相关资源
最近更新 更多