REST体系结构:数据访问层作为模型,REST的目的是调用调用DAL的业务逻辑层

时间:2019-03-30 18:09:41

标签: c# asp.net rest

我在公司中使用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);
        }
    }
}

2 个答案:

答案 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