Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 关于asp.net mvc中作为验证的服务层的问题_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 关于asp.net mvc中作为验证的服务层的问题

Asp.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 _

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

因此,我正在浏览本教程:

首先,看看清单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();
    }
}
使用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()应该在接口中定义呢