我对服务层有点困惑并使用它进行验证。
所以我正在浏览本教程:http://www.asp.net/learn/mvc/tutorial-38-cs.aspx
首先,如果你看一下清单3
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();
}
}
他们只是使用不同名称的相同界面,为什么不只使用一个呢?
public interface IProductRepository
{
bool CreateProduct(Product productToCreate);
IEnumerable<Product> ListProducts();
}
public interface IProductService
{
bool CreateProduct(Product productToCreate);
IEnumerable<Product> ListProducts();
}
在我的书中(我认为撰写本教程的作者)已将其更改为使IProductRepository无效。所以这让我更加困惑。
那么有人可以解释为什么我需要2个似乎做同样事情的接口吗?
我的下一个问题是我的存储库有删除功能。我是否也将这一个放在我的服务层中(如果您使用一个界面,我认为是强制性的,但如果您使用2那么大约那么它可能是可选的)。
那么我的服务层会有什么?它只是调用存储库中的删除功能吗?它应该只是一个无效方法还是应该返回bool?我不认为这种方法需要进行任何验证吗?
所以我不确定是否需要布尔。
答案 0 :(得分:1)
从您正在阅读的教程中:
所以,应用程序流控制逻辑 属于控制器和数据 访问逻辑属于存储库。 在那种情况下,你把你的地方放在哪里 验证逻辑?一种选择是 将验证逻辑放在一个 服务层。
服务层是附加层 在ASP.NET MVC应用程序中 调解a之间的沟通 控制器和存储库层。该 服务层包含业务逻辑。 特别是,它包含验证 逻辑。
编辑:
我不确定我能否以清晰的方式向你解释(因为我的英语不流利),但我会尝试:
服务层是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;
}
}
答案 1 :(得分:0)
我认为你在这种有限的情况下为单个接口做了一个论证,但服务和存储库执行两个非常不同的功能,如果他们共享一个接口,你可能会遇到问题。
如果CreateProduct()或ListProducts()需要在服务或存储库中具有不同的方法签名,该怎么办?
如果应该在界面中定义ValidateProduct()怎么办?存储库当然不应该实现它。
正如你所指出的那样,在这个特定的例子中不需要两个接口来定义相同的东西,但我认为作者的假设是在路上它们会有所不同,因此是必要的。