直接从数据库创建对象与SELECT

时间:2012-10-02 20:27:30

标签: c# sql-server-2008 api http-post n-tier-architecture

我目前正在开发一个集成项目来连接两个不同的系统 我的计划是设置HTTP-API以允许系统A通过HTTP-POST向系统B发出命令 这些命令将用于向SQL服务器数据库发出CRUD指令以检索和更新会员卡数据(例如“创建成员资格”,“更新成员资格”等),然后将数据作为XML返回给系统A.我知道n层设计要求我应该有一个带有几个属性的MembershipCard类:

public class MembershipCard
{
    private string number;
    private decimal points;

    public string Number
    {
        get { return number; }
        set { number = value; }
    }

    public decimal Points
    {
        get { return points; }
        set { points = value; }
    }

除了调用DAL的几种方法之外:

    public string GetPoints(string cardnumber) 
    {
        return MembershipCardDB.BalanceRequest(cardnumber);
    }

但是,我有一些困难证明这种方法是静态DAL类,MembershipCardDB似乎执行了我需要的所有工作(见下文):

    public static string BalanceRequest(string cardNumber)
    {
        string response = string.Empty;
        string sqlselect = 
            "SELECT Balance                         " +
            "FROM tbl_MemberShipCard                " +
            "WHERE Card_No = @cardNumber                 " +
            "FOR XML PATH ('Card'), ROOT('CardBalance')";

        using (SqlConnection connect = new SqlConnection("Data Source=TEST\\TEST;Initial Catalog=TEST;User Id=sa;Password=TEST"))
        {
            connect.Open();
            using (SqlCommand command = new SqlCommand(sqlselect))
            {
                command.Parameters.AddWithValue("@cardNumber", cardNumber);
                response = (string)command.ExecuteScalar();
            }
        }
        return response;
    }

通过简单地删除MembershipCard类并从数据库中提取数据并将其格式化为XML,有什么我可以忽略的吗?

4 个答案:

答案 0 :(得分:2)

关键是你应该能够独立于任何数据库接口或xml格式编写程序逻辑。将所有数据库内容放入一个加载和创建对象的单独类中。做你想做的任何事情。最后将对象存储回数据库或xml。但是,如果您的代码仅涉及导入和导出数据,则可以删除额外的类。

顺便说一句,您可以使用自动实现的属性简化MembershipCard类:

public class MembershipCard
{
    public string Number { get; set; }
    public decimal Points { get; set; }
}

我经常有一个静态DB

public static class DB
{
    public static string GetBalanceRequest(string cardNumber)
    {
        ...
    }

    public static MembershipCard LoadMembershipCard(string cardNumber)
    {
        ...
    }

    public static List<MembershipCard> LoadMembershipCards()
    {
        ...
    }

    public static void SaveMembershipCard(MembershipCard membershipCard)
    {
        ...
    }
}

您的MembershipCard课程可以有方法

    public string BalanceRequest()
    {
        return DB.GetBalanceRequest(this.Number);
    }

像这样,您可以分离数据库操作和其他应用程序逻辑。

答案 1 :(得分:1)

如果您专门公开CRUD操作,可以采用REST接口(参见Web API)。有了这条路线,我相信你有理由直接使用你的数据库类。这实际上并不违反N层方法 - Web服务实际上充当了数据层的接口。

您甚至可以更进一步,使用当前版本中的OData支持对您的服务公开延迟执行查询。

主要问题是Web API仍处于测试阶段,并且正在定期更改。例如,OData支持在发布预览中几乎没有。它在夜间构建中更先进。

答案 2 :(得分:1)

架构是一件有趣的事情。在选择范例之前,最好准确评估您要完成的工作。

有时候n层设计可以节省你的时间,但是有时你今天要编写的额外代码数量不值得。根据你的说法,听起来你已经进入后一阵营了。

所以,回到我的第一个语句,您应该问自己:您是否预见到需要将数据格式(XML)与检索(SQL查询)分开?

肯定会有你可能的情况。例如,XML非常冗长,并且包含许多您以后可能不想要的非信息性数据。通过将自己与SQL Server如何发出XML联系起来,如果你决定使用JSON,你将会看到重写。

进一步说,XML甚至JSON适用于有限数量的数据,例如一次只有几条记录,但如果你一次开始传输数百或数千,那么数据量很容易达到你的某个点只是想通过网络发送类似于CSV文件的内容。再次,你将面临重写。

但是,如果你构建它,你可以插入一个新的提供程序来处理各种格式化要求,那么你就可以编写新的代码而不是替换可能很大的旧代码补丁...而且它支持相当容易如果格式没有与检索紧密耦合,则同时使用多种格式(XML,Json,CSV,Excel,...)。

扮演恶魔主张,如果我们谈论的是一个小系统,它可能并不重要,因为格式改变所花费的时间重写代码可能是微不足道的,此时我不会花时间构建一个n - 模型。

希望有所帮助,最终我认为我们不能告诉你要走哪条路。

答案 3 :(得分:0)

  

n层设计规定我应该有一个包含多个属性的MembershipCard类

我不确定这是否准确。我认为n层设计要求每层只依赖于它下面的层。并且每个图层不需要仅依赖于它下面的 - 您可以跳过级别。因此,您的Web服务接口可以跳过域层并直接转到存储库。虽然即便如此,最好在中间添加另一个名为“应用程序”的层,它可以为您提供额外的非数据访问逻辑空间,而不是泄漏到您的UI / Web服务中。

数据库访问类中的'Console.ReadLine'正在将UI与存储库混合,因此显然不是很好。另外,使用静态方法很难编写单元测试,因此也不好。

退房...... Eric Evans的领域驱动设计。