业务逻辑层是否需要自己的模型

时间:2016-10-24 06:04:57

标签: c# asp.net asp.net-mvc 3-tier

我正在使用asp.net mvc进行3层应用程序,我想按照建议做一切。

所以我已经完成了MvcSample.Bll业务逻辑,MvcSample.Data用于数据,MvcSample.Web用于网站。

Data我的edmx文件(我使用的是数据库优先方法)和我的存储库。在Bll我正在做的服务将在网络中调用。

所以我的问题是: 我应该在Bll中编写其他模型还是使用在edmx文件中生成的模型?

6 个答案:

答案 0 :(得分:1)

这在很大程度上取决于您的应用程序试图解决的问题类型。

根据我的经验,业务逻辑很少直接从Entity Framework返回模型对象。此外,接受这些作为参数可能不是最好的主意。

实体框架模型代表您的关系数据库。因此,它的定义包含许多业务逻辑不应公开的内容,例如导航属性,计算属性等。当接受模型对象作为参数时,您可能会注意到特定业务逻辑方法不使用许多属性。在许多情况下,它会使开发人员感到困惑,并且是错误的来源。

总而言之,如果您的应用程序是快速原型,概念证明或简单的CRUD软件,那么使用EF模型类可能就足够了。但是,从实际的角度考虑定制的业务逻辑模型/ dto类。

答案 1 :(得分:0)

从我的观点来看,你需要另一个模型Bll

这将完全封装您的Bll

答案 2 :(得分:0)

我认为你的问题没有正确或错误的答案。

根据我的经验,我同时使用了两者。 让我们看下面的例子:

我有User

 public class User
 {
     public int Id{get;set;}
     public string First_Name{get;set;}
     public string Last_Name{get;set;}
     public int Age{get;set;}
     public string Password{get;set;} //let's use this for demonstration 
 }

我在DisplayAll()中有一个方法调用Bll。此方法应按全名(FirstName + LastName)及其年龄列出我的数据库中的所有用户。 我不应该返回User类,因为它会公开密码,而是我创建一个新的类UserDto

public class UserDto
{
    public string FullName{get;set;}
    public int Age{get;set;}
}

所以这是我的DisplayAll()

public List<UserDto> DisplayAll()
{
    List<UserDto> result = ctx.User  //my DbContext
                  .Select(x => new UserDto()
                  {
                  FullName = x.First_Name + " " +Last_Name,
                  Age = x.Age
                  }
    return result;
}

您可以看到,我的方法DisplayAll()同时使用UserUserDto

答案 3 :(得分:0)

这取决于您对软件设计的看法以及您希望如何利用它。通过分离BLL模型,您可以自由地进行故事特定的验证和计算。通过仅使用DLL模型,它有时很难,因为它将在DB中生效。

答案 4 :(得分:0)

您可以通过这种方式在asp.net中使用3层架构

  • MvcSample.BLL - 业务逻辑层
  • MvcSample.DAL - 数据访问层
  • MvcSample.Domain - 域层
  • MvcSample.web - 网站

所有存储库类都包含在.BLL层中。这意味着您的逻辑存储在此处。 通常.DAL用于存储.edmx类。 .Domain用于重新创建对服务器端有用的数据库对象。这意味着如果要将json对象从客户端传递给服务器,那么该对象应该在服务器端创建。所以这些类可以在.domain

中实施

答案 5 :(得分:-1)

我的方法将是

MvcSample.Data
 -- Model Classes 
 -- EDMX attach to model
MvcSample.Bll
 -- Model Inheriting MvcSample.Data.Model
 -- Business Logic Class - Using MvcSample.Bll.Model
MvcSample.Web
 -- Controller using  MvcSample.Bll.Model