相关疑难解决方法(0)

根据外部因素验证对象(即数据存储唯一性)

描述

我的解决方案有这些项目:

  • DAL =修改后的实体框架
  • DTO =能够验证自己的数据传输对象
  • BL =业务层服务
  • WEB =演示Asp.net MVC应用程序

DAL,BL和WEB都参考了很棒的DTO.
该过程通常以这种方式执行:

  1. 向WEB发出Web请求
  2. WEB获得DTO发布
    • DTO通过自定义ActionFilter自动验证
    • 验证错误是自动收集的
  3. (验证是可以的)WEB调用BL提供DTO
  4. BL通过使用DTO调用DAL(可以通过它们或只是使用它们)

那么DTO验证问题......

我的DTO能够根据自己的状态(属性值)验证自己.但是现在我遇到了问题,但事实并非如此.我需要他们使用BL(以及因此DAL)进行验证.

我的现实生活中的例子:用户注册和WEB获得验证的用户DTO.有问题的部分是username验证.应根据数据存储检查其唯一性.
我该怎么做?

还有其他信息表明所有DTO都实现了IoC和TDD 的接口(即UserDTO实现IUser).两者都是DTO项目的一部分.

不可能尝试

  1. 我无法在DTO中引用BL,因为我将获得循环引用.
    Compilation error
  2. 我无法创建一个额外的DTO.Val项目,它将引用部分DTO类并在那里实现它们的验证(它们引用BL + DTO).
    Partial classes can't span assemblies.

可能的尝试

  1. 创建一个特殊的ActionFilter,可以根据外部条件验证对象.这个将在WEB项目中创建,因此可以看到将在此处使用的DTO和BL.
  2. 将DTO放在BL中并将DTO接口保持为其他项目引用的实际DTO,并重构所有代码以使用接口而不是具体类.
  3. 不处理外部依赖验证,并让外部依赖项抛出异常 - 可能此问题的最糟糕的解决方案

你会建议什么?

validation asp.net-mvc xval data-annotations

10
推荐指数
2
解决办法
5042
查看次数

除了一个集会外,我怎样才能隐藏"setter"?

我的另一个问题中,我已经提到了这个问题,但我认为值得将其分解为自己的问题,因为它并不真正依赖于我提到的其他场景.

无论如何 - 在Q上,不知道这是否可能.寻找解决方案/解决方法.

我有一个类库,只有POCO:

MyCompany.MyProject.Domain.POCO
Run Code Online (Sandbox Code Playgroud)

这个程序集有一个这样的POCO:

public class Post
{
   public int PostId { get; set; }
   public int Name { get; set; }
      ...
}
Run Code Online (Sandbox Code Playgroud)

现在,我有另一个类库,它是我的DAL/Repository,并使用Entity Framework 4.0进行持久化:

MyCompany.MyProject.Repositories
Run Code Online (Sandbox Code Playgroud)

这个程序集引用了POCO项目,因为它需要在POCO上执行CRUD操作(抓取DB对象,项目进入POCO,返回,以及修改POCO).

现在,我还有一个Web应用程序,它同时引用了POCO和Repository程序集.

如果我这样做:

somePOCO.PostId = 10;
Run Code Online (Sandbox Code Playgroud)

我得到一个SQLException,因为PostId是数据库中的IDENTITY字段,因此不应该明确设置.

有没有办法可以隐藏这些特殊属性的setter,以便只有存储库可以访问setter?

我想不出用常规辅助功能修饰符来做到这一点的方法(因为它们都不适合这种情况),你们能想到一个解决方法吗?

.net c# assemblies access-modifiers getter-setter

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