2

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

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

我发现这个问题被标记为已回答,因为它谈到了依赖解析器,但我找不到任何有用的信息。

我尝试研究它,但我遇到的只是依赖注入或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都是空的。我真的在这里用尽了所有想法,我将不胜感激。

4

1 回答 1

1

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

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

让我知道这些是否有帮助。而且我有兴趣从社区了解更多关于不违反 DI 模式的方式(例如 3.)。

于 2017-02-17T18:56:13.207 回答