相关疑难解决方法(0)

将服务层与验证层分开

我目前有一个服务层,它基于ASP.NET站点中的服务层验证一文.

根据这个答案,这是一个糟糕的方法,因为服务逻辑与违反单一责任原则的验证逻辑混合在一起.

我真的很喜欢提供的替代方案,但在重新分解我的代码时,我遇到了一个我无法解决的问题.

请考虑以下服务接口:

interface IPurchaseOrderService
{
    void CreatePurchaseOrder(string partNumber, string supplierName);
}
Run Code Online (Sandbox Code Playgroud)

基于链接答案的以下具体实现:

public class PurchaseOrderService : IPurchaseOrderService
{
    public void CreatePurchaseOrder(string partNumber, string supplierName)
    {
        var po = new PurchaseOrder
        {
            Part = PartsRepository.FirstOrDefault(p => p.Number == partNumber),
            Supplier = SupplierRepository.FirstOrDefault(p => p.Name == supplierName),
            // Other properties omitted for brevity...
        };

        validationProvider.Validate(po);
        purchaseOrderRepository.Add(po);
        unitOfWork.Savechanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

PurchaseOrder传递给验证器的对象还需要两个其他实体,Part并且Supplier(假设此示例中PO只有一个部分).

如果用户提供的详细信息与数据库中需要验证程序抛出异常的实体不对应,则PartSupplier对象都可以为null.

我遇到的问题是,在此阶段验证器丢失了上下文信息(部件号和供应商名称),因此无法向用户报告准确的错误.我可以提供的最佳错误是"采购订单必须具有关联部件",这对用户没有意义,因为他们确实提供了部件号(它在数据库中不存在).

使用ASP.NET文章中的服务类,我正在做这样的事情:

public void …
Run Code Online (Sandbox Code Playgroud)

c# service-layer asp.net-mvc-3

32
推荐指数
1
解决办法
9436
查看次数

ASP.NET MVC 6中对Ninject的持续支持?

我一直很愉快地使用Ninject现在很长一段时间,我真的很喜欢它,但我面对的,因为释放一个艰难的选择ASP.NET 5MVC 6.

基本上,微软已经发布了自己的依赖注入系统; 据我所知,这引起了很多批评.但我更大的问题在于它如何影响其他图书馆.

我在网上提出的另一个问题其他资源来看,似乎Ninject不能与MVC 6一起开箱即用.尽管有一个以详细库形式给出的"解决方案" Microsoft.Framework.DependencyInjection.Ninject and Ninject.这甚至比较棘手,因为该库需要添加https://www.myget.org/F/aspnetmaster/到您的NuGet提要列表中.

我做了一些挖掘,发现这个图书馆的托管地点; 它看起来不错,它似乎可以从我能说的工作中得到解决,但有一些事情让我感到困扰.

  • 图书馆似乎并没有真正由Ninject创作者领导
  • 图书馆深埋在一个不起眼的存储库中
  • 网上的实际Ninject资源从未提及过

基本上,我非常担心这是某种乐队助手,对Ninject(甚至其他容器库)的支持正在消失.是否有一些隐藏的信息,我只是没有发现?

ninject asp.net-core-mvc

15
推荐指数
2
解决办法
4941
查看次数

服务层验证

我正在尝试在我的应用程序中实现验证策略.我有一个MVC层,服务层,存储库和域POCO.现在在MVC层,我在我的viewmodels上使用数据注释来验证用户输入,允许我给用户快速反馈.在控制器中,我在使用automapper设置域对象之前调用ModelState.IsValid来检查输入.

这就是我的麻烦所在.我将我的域对象传递给需要根据我的业务规则验证它的服务,但是如何将验证错误传递回控制器?我找到的示例执行以下操作之一:

  • 在Service层中抛出异常并捕获Contoller.但这似乎是错误的,例外情况肯定是例外,我们应该返回一些有意义的东西.
  • 使用ModelStateWrapper并将ModelStateDictionary注入Service.但是这种方法最终会展现成循环依赖(控制器依赖于服务,服务依赖于控制器),这似乎是一个糟糕的代码味道.
  • 将验证方法添加到POCO.问题在于业务规则可能依赖于其他POCO对象,所以这肯定应该在可以访问所需表和对象的服务中完成.

我缺少一种更简单的方法吗?我已经看到很多关于此的问题,但除了上面提到的那些之外没有具体的解决方案.我认为服务中进行验证的任何方法都可以传回一些我可以在控制器中使用的键/值对象,但我不确定此策略是否会在以后出现问题.

validation asp.net-mvc asp.net-mvc-3

14
推荐指数
1
解决办法
3227
查看次数

Web应用程序的表单验证 - 设计将域错误传播到客户端?

数据验证应在Web应用程序的以下位置进行:

  • 客户端:浏览器.加快用户错误报告
  • 服务器端:控制器.检查用户输入是否在语法上有效(没有sql注入,例如,所有传入字段的有效格式,所有必填字段都填写等)
  • 服务器端:模型(域层).检查用户输入是否在域中有效(没有重复的用户名,帐户余额不是负数等)

我目前是DDD粉丝,所以我在我的应用程序中分离了UI和Domain层.

我也试图遵循这个规则,域模型永远不应该包含无效数据.

那么,如何在应用程序中设计验证机制,以便在域中发生的验证错误正确传播到客户端?例如,当域模型引发有关重复用户名的异常时,如何将该异常正确绑定到提交的表单?

一些启发了这个问题的文章可以在这里找到:http://verraes.net/2015/02/form-command-model-validation/

我在Web框架中看不到这样的机制.首先想到的是让域模型包含字段的名称,导致异常,在异常数据中,然后在UI层中提供表单数据字段和模型数据字段之间的映射,以在其上下文中正确显示错误对于用户.这种方法有效吗?它看起来很不稳定......有一些更好的设计的例子吗?

architecture validation domain-driven-design

10
推荐指数
1
解决办法
433
查看次数

通过在 ASP.NET MVC 中抛出异常进行自定义验证

我正在验证 ASP.NET MVC 中的模型,并抛出一个包含这些错误列表的自定义异常。这是首选的最佳实践,还是我应该返回一个强类型的错误列表,而不是使用 throw new CustomException(List errors)。无论在 BaseController 中的 OnException 中处理 ajax 请求还是回发,我都会捕获这些错误。

validation exception-handling asp.net-mvc-3

1
推荐指数
1
解决办法
1828
查看次数