我目前正在开发一个集成项目来连接两个不同的系统 我的计划是设置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,有什么我可以忽略的吗?
答案 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的领域驱动设计。