【问题标题】:Design Pattern decisions - REST API & DAL设计模式决策 - REST API 和 DAL
【发布时间】:2014-09-23 09:11:17
【问题描述】:

我正在开发具有 WCF REST API 且低于某些 DAL 的应用程序。一切都是用 C# 编写的。

所有 REST 方法都是 GET,但其中许多具有我解析并映射到列表对象的通用字符串参数(以及其他参数)。效果很好。

当涉及到 Dto 对象的映射时,我想使用一些设计模式来根据映射的 REST 参数实例化正确的 Dto。不确定是否有可能,因为我有那个通用字符串参数(参数名称不会一直相同)?

另外,根据创建的 Dto 类型,我想选择合适的 DB 方法来调用,我猜是这个的命令设计模式?

感谢您的帮助, 如果需要,我可以解释更多。

【问题讨论】:

  • DAL是Service层当前引用的类库
  • generic string parameter 是过滤器和排序条件吗?另外,All REST methods are GET 它们都是不改变 REST 应用程序资源状态的安全方法吗?
  • @nikita 是的,是的。我不使用 ORM,所以过滤器是我手动处理的字符串参数
  • @user1073210 那你为什么不使用 OData?
  • @user1073210 如果您不想使用 ORM,那么您可以使用 WCF 数据服务附带的 ReflectionProvider。如果您不想使用 Odata,您可以从中获取查询语法并使用 Linq2Rest 库,该库使您能够将 Odata 查询转换为 LINQ 表达式。

标签: c# api design-patterns factory-pattern command-pattern


【解决方案1】:

我开发了相同类型的应用程序(WCF REST 服务)。

我创建了 .net 解决方案并添加到项目下面

  • 业务层
  • DataAcessLayer
  • 数据服务(WCF 服务)
  • 实体层

数据服务:

 public SnapshotData GetSnapshot(string symbol, int nocache)
    {
        SnapshotData objSnapshotData;
        try
        {
                objSnapshotData = (new SnapshotBAL()).GetSanpshotData(symbol);
                SerializeObject(objSnapshotData, localCacheKey);

            return objSnapshotData;
        }
        catch (Exception ex)
        {

            return null;
        }
    }

业务层:

namespace BusinessLayer
{
public class SnapshotBAL
{
    public Snapshot GetSanpshot(string symbol)
    {
        return (new SnaapshotDAL()).GetSanpshot(symbol);
    }       
}
}

EntiryLayer:

namespace EntityLayer
{
public class Snapshot
{

    public DateTime time { get; set; }
    public double price { get; set; }
 }
}

数据访问层:

namespace DataAccessLayer
{
public class SnaapshotDAL : PrototypeDB
{
    public Snapshot GetSanpshot(string symbol)
    {
        AddParameter("o_snapshot");
        AddParameter("i_symbol", symbol);

        Snapshot objSanapshot = new Snapshot();

        return ObjectHelper.FillObject<Snapshot>(typeof(Snapshot), GetReader("A_SM7_V1_P.GetSnapshotQuick"));
    }
}
}

【讨论】:

    【解决方案2】:

    问题的关键是:

    ...根据映射的 REST 参数实例化正确 Dto 的设计模式

    在我看来,这听起来像是您想使用Factory Pattern

    呃。是的,我知道,货物崇拜编程等,但是(!),有充分的理由:

    • 您想根据一些设置初始化一个类(DAL)
    • 您希望在顶层定义这些设置(REST 映射)
    • 您希望较低级别的代码完全不了解设置(对吗?),以便它们可以任意更改而无需系统范围的重构。

    当然,您总是可以只将 DAL 的一个实例向下传递,但这并不总是可行的,而且可能会有点杂乱无章。

    或者...

    考虑创建一个 DAL 实现,该实现可以识别各种开关并将delegate 调用到正确的 DAL 实现。这实际上可能比直接工厂更轻。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多