Asp.net mvc 关于asp.net mvc中作为验证的服务层的问题
我对服务层和使用它进行验证有点困惑 因此,我正在浏览本教程: 首先,看看清单3Asp.net mvc 关于asp.net mvc中作为验证的服务层的问题,asp.net-mvc,Asp.net Mvc,我对服务层和使用它进行验证有点困惑 因此,我正在浏览本教程: 首先,看看清单3 using System.Collections.Generic; using System.Web.Mvc; namespace MvcApplication1.Models { public class ProductService : MvcApplication1.Models.IProductService { private ModelStateDictionary _
using System.Collections.Generic;
using System.Web.Mvc;
namespace MvcApplication1.Models
{
public class ProductService : MvcApplication1.Models.IProductService
{
private ModelStateDictionary _modelState;
private IProductRepository _repository;
public ProductService(ModelStateDictionary modelState, IProductRepository repository)
{
_modelState = modelState;
_repository = repository;
}
protected bool ValidateProduct(Product productToValidate)
{
if (productToValidate.Name.Trim().Length == 0)
_modelState.AddModelError("Name", "Name is required.");
if (productToValidate.Description.Trim().Length == 0)
_modelState.AddModelError("Description", "Description is required.");
if (productToValidate.UnitsInStock < 0)
_modelState.AddModelError("UnitsInStock", "Units in stock cannot be less than zero.");
return _modelState.IsValid;
}
public IEnumerable<Product> ListProducts()
{
return _repository.ListProducts();
}
public bool CreateProduct(Product productToCreate)
{
// Validation logic
if (!ValidateProduct(productToCreate))
return false;
// Database logic
try
{
_repository.CreateProduct(productToCreate);
}
catch
{
return false;
}
return true;
}
}
public interface IProductService
{
bool CreateProduct(Product productToCreate);
IEnumerable<Product> ListProducts();
}
}
使用System.Collections.Generic;
使用System.Web.Mvc;
名称空间MVCAPApplication1.Models
{
公共类ProductService:MVCAPApplication1.Models.IPProductService
{
私有ModelStateDictionary\u modelState;
私有IPU存储库;
公共产品服务(ModelStateDictionary modelState、IPProductRepository存储库)
{
_modelState=modelState;
_存储库=存储库;
}
受保护的bool ValidateProduct(Product productToValidate)
{
if(productToValidate.Name.Trim().Length==0)
_AddModelError(“Name”,“Name是必需的。”);
if(productToValidate.Description.Trim().Length==0)
_AddModelError(“说明”,“需要说明”);
if(productToValidate.UnitsInStock<0)
_AddModelError(“UnitsInStock”,“库存单位不能小于零”);
返回_modelState.IsValid;
}
公共IEnumerable列表产品()
{
返回_repository.ListProducts();
}
public bool CreateProduct(Product Product ToCreate)
{
//验证逻辑
如果(!ValidateProduct(productToCreate))
返回false;
//数据库逻辑
尝试
{
_repository.CreateProduct(productToCreate);
}
抓住
{
返回false;
}
返回true;
}
}
公共接口IPProductService
{
bool CreateProduct(Product Product ToCreate);
IEnumerable ListProducts();
}
}
它们使用相同的接口,只是名称不同,基本上为什么不使用一个呢
public interface IProductRepository
{
bool CreateProduct(Product productToCreate);
IEnumerable<Product> ListProducts();
}
public interface IProductService
{
bool CreateProduct(Product productToCreate);
IEnumerable<Product> ListProducts();
}
公共接口存储库
{
bool CreateProduct(Product Product ToCreate);
IEnumerable ListProducts();
}
公共接口IPProductService
{
bool CreateProduct(Product Product ToCreate);
IEnumerable ListProducts();
}
但在我的书中(我认为是编写本教程的作者)将其更改为将IPProductRepository作废。这让我更加困惑
那么,有人能解释为什么我需要两个似乎做同样事情的接口吗
我接下来的问题是我的存储库有一个删除功能。我是否也把这个放在了我的服务层中(我想如果你使用一个接口,那么它是强制性的,但是如果你使用2个接口,那么它可能是可选的)
那么,我的服务层中会有什么?它会调用存储库中的delete函数吗?它应该是一个void方法还是返回bool?我认为这种方法不需要进行任何验证
因此,我不确定是否需要bool。您正在阅读的教程: 因此,应用程序流控制逻辑 属于控制器和数据 访问逻辑属于存储库。 那样的话,你把钱放在哪里 验证逻辑?一个选择是 将验证逻辑放入 服务层 服务层是一个附加层 在ASP.NET MVC应用程序中 调解客户之间的沟通 控制器和存储库层。这个 服务层包含业务逻辑。 特别是,它包含验证 逻辑 编辑: 我不确定我是否能清楚地向您解释(因为我的英语不流利),但我会尝试: 服务层是ASP.NET MVC应用程序中的一个附加层,它调解控制器和存储库层之间的通信,因为您可以处理验证和应用程序业务。有时,您的服务将需要使用其对应存储库层的两个或多个方法,因此它不需要具有相同的接口 一个基本的例子,让我们假设你有一个注册表格 您将拥有以下接口
public interface IUserService
{
bool Register(User mUser);
bool Validate(User mUser);
}
public interface IUserRepository
{
User FindUserByEmail(string Email);
bool Insert(User mUser);
}
因此,您将得到两个类,它们将执行以下操作:
公共类UserRepository:IUserRepository{
User FindUserByEmail(string Email)
{
//do a ninja search and return an user or null
}
bool Insert(User mUser);
{
//Insert user into db
}
}
public class UserService: IUserService
{
public bool Validate(User mUser)
{
//validate user
}
IUserRepository _respository = new UserRepository();
bool Register(User mUser)
{
if(Validate(mUser);
var hasUser = _respository.FindUserByEmail(User.Email);
if(hasUser==null)
return _respository.Insert(mUser);
return false;
}
}
从您正在阅读的教程中: 因此,应用程序流控制逻辑 属于控制器和数据 访问逻辑属于存储库。 那样的话,你把钱放在哪里 验证逻辑?一种选择是 将验证逻辑放入 服务层 服务层是一个附加层 在ASP.NET MVC应用程序中 调解客户之间的沟通 控制器和存储库层 服务层包含业务逻辑。 特别是,它包含验证 逻辑 编辑: 我不确定我是否能清楚地向您解释(因为我的英语不流利),但我会尝试: 服务层是ASP.NET MVC应用程序中的一个附加层,用于调解控制器和存储库层之间的通信,因为您可以处理验证和应用程序业务。有时,您的服务需要使用其相应存储库层的两个或多个方法,因此它不需要在中使用相同的方法介面 一个基本的例子,让我们假设你有一个注册表格 您将拥有以下接口
public interface IUserService
{
bool Register(User mUser);
bool Validate(User mUser);
}
public interface IUserRepository
{
User FindUserByEmail(string Email);
bool Insert(User mUser);
}
因此,您将得到两个类,它们将执行以下操作:
公共类UserRepository:IUserRepository{
User FindUserByEmail(string Email)
{
//do a ninja search and return an user or null
}
bool Insert(User mUser);
{
//Insert user into db
}
}
public class UserService: IUserService
{
public bool Validate(User mUser)
{
//validate user
}
IUserRepository _respository = new UserRepository();
bool Register(User mUser)
{
if(Validate(mUser);
var hasUser = _respository.FindUserByEmail(User.Email);
if(hasUser==null)
return _respository.Insert(mUser);
return false;
}
}
我认为在这种有限的情况下,您已经为单一接口进行了论证,但是服务和存储库执行两种截然不同的功能,如果它们共享单一接口,您可能会遇到问题 如果CreateProduct()或ListProducts()需要在服务或存储库中具有不同的方法签名,该怎么办 如果ValidateProduct()应该在接口中定义呢