针对数据库

时间:2016-09-26 16:27:20

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

我需要使用其他注册服务来验证对数据库的字段。我一直在阅读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 都为null。我在这里已经筋疲力尽了所有的想法,我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:1)

我面临类似的问题。我尝试了一些&#34;斑驳的&#34;方式(以防你&#34;必须&#34;)。就像我遇到了电子邮件的DuplicateMatch属性一样 - 这需要数据库访问,我的自定义validationAttribute中没有任何内容。

  1. 我的DAL是单独的项目,所以不是纯粹的DI(依赖注入) - 我在DAL中保留了DBConext初始化(它有自己的appSettings.json)所以没有其他人正在打扰通过DBContext等...只是调用DAL(或服务层),它将自己创建一个DBContext。
  2. 以某种方式使用&#34;服务定位器&#34;获取DBContext实例的模式以及已为DI配置的任何其他对象 - 尚未测试。
  3. 服从DI模式并执行我的DuplicateMatch或任何其他此类验证(需要在控制器操作本身或服务层中进行DAL访问)而不是验证属性。
  4. 如果有任何帮助,请告诉我。而且我有兴趣从社区中了解更多关于不违反DI模式的方法(例如3.)。