我正在使用asp.net mvc进行3层应用程序,我想按照建议做一切。
所以我已经完成了MvcSample.Bll
业务逻辑,MvcSample.Data
用于数据,MvcSample.Web
用于网站。
在Data
我的edmx
文件(我使用的是数据库优先方法)和我的存储库。在Bll
我正在做的服务将在网络中调用。
所以我的问题是:
我应该在Bll
中编写其他模型还是使用在edmx文件中生成的模型?
答案 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()
同时使用User
和UserDto
答案 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