【问题标题】:ASP.NET Core Custom Validation against database针对数据库的 ASP.NET Core 自定义验证
【发布时间】:2017-02-18 02:56:13
【问题描述】:

我需要针对可能使用其他注册服务的数据库验证字段。我一直在阅读documentation,但还没有找到真正的答案。

有调用控制器方法的远程验证,但它只是客户端,所以禁用 JS 会禁用验证。还有使用验证属性的自定义验证,并且很好地包含在ModelState.IsValid 中,但我无法将依赖项注入它的构造函数。

我发现 this question 标记为已回答,因为它涉及依赖解析器,但我找不到任何有用的信息。

我尝试研究它,但我遇到的只是依赖注入或IServiceProvider,这对我不起作用。以下是我的一些失败尝试:

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        //--1-------------------------------
        var container = new ServiceContainer();
        var _context = container.GetService<ApplicationDbContext>();
        //----------------------------------

        //--2-------------------------------
        var services = new ServiceCollection();
        IServiceProvider servicesProvider = services.BuildServiceProvider();
        var _context = servicesProvider.GetService<ApplicationDbContext>();
        //----------------------------------

        return ValidationResult.Success;
    }

每个检索到的 _context 都是空的。我真的用尽了这里的所有想法,如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 您不应将依赖项注入到hereherehere 所表达的属性中。
  • 最后,我还实现了一项服务,用于仅对数据库进行的剩余验证,遗憾的是没有简单的方法来使用通常继承的 @987654329 @.

标签: c# validation dependency-injection asp.net-core dependency-resolver


【解决方案1】:

我面临着类似的问题。我尝试了一些“不完整”的方法(以防万一你“不得不”)。就像我被电子邮件的 DuplicateMatch 属性卡住了一样——它需要数据库访问,而我的自定义验证属性中没有任何可用的东西。

  1. 我的 DAL 是单独的项目,所以不是纯 DI(依赖注入) - 我在 DAL 中保留了 DBConext 初始化(它有自己的 appSettings.json),所以没有其他人被打扰传递 DBContext 等...只需调用DAL(或服务层),它将设法自行初始化一个 DBContext。
  2. 不知何故使用“服务定位器”模式来获取 DBContext 的实例和任何其他已为 DI 配置的对象 - 尚未测试。
  3. 遵守 DI 模式并执行我的 DuplicateMatch 或任何其他此类验证(需要在控制器操作本身或服务层中访问 DAL),而不是验证属性。

如果这些有帮助,请告诉我。而且我有兴趣从社区了解更多关于不违反 DI 模式的方式(例如 3.)。

【讨论】:

  • 感谢您的回答,我尝试了@Steven 的一些建议,但我认为我没有必要的知识来完全理解它们,而且对于这样一个(看似)简单的任务来说似乎需要做很多工作.我最终使用了第三种方式,我将验证放在服务中。不像属性那样优雅的解决方案,但它看起来很安全,并且保持它在服务中允许控制器保持相对清洁。稍后我会看看你的其他建议,因为我现在有很多工作。
猜你喜欢
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多