我在公司中使用SOAP Web服务,并且习惯于它们的体系结构,即Service> BLL> DAL。目前,我正在研究REST,根据我的观察,我认为Model与DAL相同。
所以我打算做的是让我的REST中的Controller绕过Models,而是调用调用DAL的BLL(并执行一些逻辑)。这意味着我的模型将不被使用。这样可以吗如果没有,请提供一些建议和提示。
编辑:我没有从SOAP升级到REST。我正在研究REST,并为此做一个单独的项目
下面是我的示例REST体系结构:
MyProjectDAL> UserDAL
namespace DAL
{
public class UserDAL
{
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string First_Name { get; set; }
public string Last_Name { get; set; }
public int User_Type { get; set; }
}
public User User_GetRecById(string id)
{
string cnStr = Utilities.Common.dbConnStr;
MySqlConnection cn = new MySqlConnection(cnStr);
MySqlCommand cmd = new MySqlCommand();
DataTable dt = new DataTable();
MySqlDataAdapter adapter = new MySqlDataAdapter();
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "User_GetRecById";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@p_Id", id);
cn.Open();
cmd.Connection = cn;
adapter.SelectCommand = cmd;
adapter.Fill(dt);
var userList = Utilities.Common.ToList<User>(dt);
return userList.FirstOrDefault();
}
catch (Exception ex)
{
throw ex;
}
finally
{
cn.Close();
cn.Dispose();
cmd.Dispose();
dt.Dispose();
adapter.Dispose();
}
}
}
}
MyProjectBLL>用户
namespace BLL
{
public class User
{
public UserDAL.User User_GetRecById(string username, string password)
{
var objDAL = new UserDAL();
var user = objDAL.User_GetRecById(username, password);
//add more logic here
return user;
}
}
}
RestService>控制器> UserController
namespace RestService.Controllers
{
public class UserController : ApiController
{
// GET
public UserDAL.User Get(string user, string encryptedPW)
{
var objBll = new BLL.User();
return objBll.User_GetRecById(user, encryptedPW);
}
}
}
答案 0 :(得分:1)
更正问题 首先,MVC和REST是两个不同的概念。您的问题与REST概念没有任何关系。它与MVC有关。
MVC与REST之间的区别: 我没有列出所有差异的详细信息,但是现在提供这两者的基本概述可以为您提供帮助。您可以在两个主题上找到n个来源。
1。休息谈论: 如何形成适当的观点? 如何接受数据? (在正文中,网址路径或网址查询参数中)。等等...
2。 MVC谈论: 如何模块化您的Web应用程序代码?
您可以将MVC应用于任何Web应用程序,而不管该Web应用程序使用的是哪种类型的Web服务体系结构或准则(SOAP / REST)。
回答您的问题
现在谈到MVC,M代表(业务逻辑+数据库逻辑都)。因此,理想情况下,您不应该将这两者合并为一个。在实现任何api时,您都应至少在后端创建三层(控制器,业务层,数据库层)。控制器永远不要直接与数据库层通信,应该有API的代理服务。
---------- MVC --------- is ----- M(业务层+数据层)+ V(视图)+ C -----(控制器)
例如:
控制器
@GetMapping(value = "myapi/Books")
public Books getBook(String bookId) {
bookService.getBook(bookId);
}
服务或业务层
根据if和else等在数据库调用之后(例如日志记录,错误处理,商务逻辑)之前应用逻辑...
public Book getBook(String bookId) {
bookDAL.getBook(bookId);
}
数据库层
public Book getBook(String bookId) {
dbClient.getBook(bookId);
}
答案 1 :(得分:1)
关于您的代码段,我看到您的BLL(我认为是您的应用程序域)取决于DAL。如果将来要更改DAL结构,您也将不得不更改BLL(这不是最好的方法)。因此,一个快速的胜利可能是通过添加Dto或通用接口来使它们分离一些。跳过“模型”将来很容易变得很难维护。
我也想给您一个更一般的建议。
如果您真的想推动自己的知识发展,并且您有大量的时间和资源用于重构,那么我建议您看一下Clean Architecture哲学。
我的个人出发点是这段视频Clean Architecture with ASP.NET Core 2.1,然后您还可以购买罗伯特·C·马丁(Robert C. Martin)的书“清洁建筑”,或者看看他的博客HERE