有关服务层作为asp.net mvc验证的问题

时间:2009-08-21 18:37:17

标签: asp.net-mvc

我对服务层有点困惑并使用它进行验证。

所以我正在浏览本教程: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?我不认为这种方法需要进行任何验证吗?

所以我不确定是否需要布尔。

2 个答案:

答案 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()怎么办?存储库当然不应该实现它。

正如你所指出的那样,在这个特定的例子中不需要两个接口来定义相同的东西,但我认为作者的假设是在路上它们会有所不同,因此是必要的。