SimpleInjector 和 FluentValidationFactory

2024-04-25

我正在尝试自动化视图模型的验证,我知道我可以添加一个属性来指定我的验证,但有一个选项可以设置一个工厂来自动化所有这些,我查看了:这个答案 https://stackoverflow.com/questions/9984144/what-is-the-correct-way-to-register-fluentvalidation-with-simpleinjector并使用简单的注入器 3.1 想出了这个:

public class CustomValidatorFactory:ValidatorFactoryBase
    {
        private readonly Container siContainer;
        public CustomValidatorFactory(Container siContainer)
        {
            var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
            this.siContainer = siContainer;
            this.siContainer.Register(typeof(IValidator<>), assemblies);
        }
        public override IValidator CreateInstance(Type validatorType)
        {
            //var instances = siContainer.GetAllInstances(validatorType);
            var implementation = ((IServiceProvider)siContainer).GetService(validatorType);
            var validatorInstance = implementation != null ? (implementation as IValidator) : null;
            return validatorInstance;
        }
    }

那么视图模型可以是这样的

public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
}

public class PersonValidator : AbstractValidator<Person> {
    public PersonValidator() {
        RuleFor(x => x.Id).NotNull();
        RuleFor(x => x.Name).Length(0, 10);
        RuleFor(x => x.Email).EmailAddress();
        RuleFor(x => x.Age).InclusiveBetween(18, 60);
    }
}

然而实现变量总是为空,我也尝试过RegisterCollection但仍然有同样的问题,似乎简单的注入器不知道当验证器继承自AbstractValidator时如何解析IValidator(这是实现IValidator的类)


在 Simple Injector 中注册 Fluent Validation Factory,如下所示:

public class ApplicationValidatorFactory : IValidatorFactory
{
    private readonly Container _container;

    /// <summary>The constructor of the factory.</summary>
    /// <param name="container">The Simple Injector Container</param>
    public ApplicationValidatorFactory(Container container)
    {
        _container = container;
    }

    /// <summary>Gets the validator for the specified type.</summary>
    public IValidator<T> GetValidator<T>()
    {
        return _container.GetInstance<IValidator<T>>();
    }

    /// <summary>Gets the validator for the specified type.</summary>
    public IValidator GetValidator(Type type)
    {
        var validator = typeof(IValidator<>).MakeGenericType(type);
        return (IValidator)_container.GetInstance(validator);
    }
}

然后在您的 Composition Root 中将其注册为 ASP.NET MVC:

// Register the validators and factory
var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();   
container.Register<IValidatorFactory, ApplicationValidatorFactory>(Lifestyle.Singleton);
container.Register(typeof(IValidator<>), assemblies);

// Register Simple Injector validation factory in FV
FluentValidationModelValidatorProvider.Configure(provider => {
        provider.ValidatorFactory = new ApplicationValidatorFactory(container);
        provider.AddImplicitRequiredValidator = false;
    }
);

The FluentValidationModelValidatorProvider发现于FluentValidation.MVC集成包。请记住获取适合您正在运行的 MVC 版本的版本。

UPDATE

您可以为没有验证器的对象注册一个空验证器,例如:

/// <summary>
/// Adds an unregistered type resolution for objects missing an IValidator.
/// </summary>
/// <typeparam name="T">The type.</typeparam>
internal sealed class ValidateNothingDecorator<T> : AbstractValidator<T>
{
    // I do nothing :-)
}

// Add unregistered type resolution for objects missing an IValidator<T>
// This should be placed after the registration of IValidator<>
container.RegisterConditional(typeof(IValidator<>), typeof(ValidateNothingDecorator<>), Lifestyle.Singleton, context => !context.Handled);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SimpleInjector 和 FluentValidationFactory 的相关文章

  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • 实体框架一对多关系

    我的 EF 查询大约需要 3 秒才能获取 10 个玩家 因为它获取另一个表的所有 500k 行 而不是我需要的少数行 这是玩家实体 namespace RocketLeagueStats Database Entities Table pl
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • 这个洗牌算法有什么问题吗?

    我一直在做一些休闲假期计算 我的迷你项目是模拟意大利游戏 tomboli 一个关键的组成部分是对以下过程的模拟 游戏由一名男子控制 他拿着一袋 90 个弹珠 编号为 1 到 90 他从袋中随机取出一颗弹珠 每次向玩家喊出弹珠编号 经过一番思
  • 从 proc/pid/cmdline 解析命令行参数

    我正在尝试解析命令行参数另一个程序 这是一个模拟器 在我的程序中使用system 命令和模拟器的pid 不幸的是同时使用文件读取和cat 输出格式不正确 所以我无法真正获取数据 cat在命令行上显示删除了空格的文件内容 整个字符串粘在一起
  • LockBits 性能关键代码

    我有一个方法需要尽可能快 它使用不安全的内存指针 这是我第一次尝试这种类型的编码 所以我知道它可能会更快
  • 类模板的可变参数构造函数模板的特化

    这是一个带有可变参数构造函数的类 它专门用于从临时对象进行复制和移动 template
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • 自定义文件属性

    我需要遵循 在我的申请中 我有文件 需要随时签入和签出的文件 当我从应用程序中签出文档时 我需要将自定义属性添加到文件中 以便稍后在签入文档时可以识别它 我尝试使用以下代码使用 DSOFile 中的 OleDocumentPropertie
  • .NET 配置(app.config/web.config/settings.settings)

    我有一个 NET 应用程序 它具有用于调试和发布版本的不同配置文件 例如 调试 app config 文件指向开发SQL服务器 http en wikipedia org wiki Microsoft SQL Server它启用了调试并且发
  • 使用 PrimarySearcher.FindAll() 时出现内存泄漏

    我也有一个使用插件和应用程序域长时间运行的服务 并且由于使用目录服务而出现内存泄漏 请注意 我正在使用 system directoryservices accountmanagement 但据我了解 它使用相同的底层 ADSI API 因
  • 在 Winforms 中,PreviewKeyDown() 从未针对任何键触发

    我最初试图让我的程序获取箭头键 上 下 左 右 的输入 但发现在 KeyDown 中这些键从未出现过 后来我发现我可以通过进入 PreviewKeyDown 函数并设置来启用箭头键 e IsInputKey true 及其周围的任何条件和逻
  • 如何使用实体框架更新特定记录的一个字段?

    我想要更新一个名叫 Pejman 的人的家庭情况 这是我的对象类 public class Person public int Id get set public string FirstName get set public string
  • 在 C、C++ 中实现腐蚀、膨胀

    我对二值图像的膨胀是如何完成的有理论上的了解 AFAIK 如果我的 SE 结构元素 是这样的 0 1 1 1 在哪里 代表中心 我的图像 二进制是这样的 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0
  • invoke_result获取模板成员函数的返回类型

    如何获取模板成员函数的结果类型 下面的最小示例说明了该问题 include
  • 接口作为类型约束和接口作为参数之间的区别?

    如果我想创建一个采用实例的方法IList作为参数 或任何其他接口 但让我们使用IList作为一个例子 我可以创建一个带有类型约束的通用方法 例如 public static void Foo1
  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • C++ 中的 Ofstream 数组

    我想要在我的项目中使用 41 个输出文件来在其上写入文本 首先创建一个字符串数组list为了命名这些输出文件 然后我尝试定义一个 ofstream 对象数组并使用list命名它们 但我收到此错误 outfile cannot be used
  • 通过 boost::python 将 C++ 对象传递给 python 函数

    我想在 C 应用程序中使用嵌入 python 并调用 python 脚本中定义的函数 该函数的参数是一个 C 对象 看我的代码 class Test public void f std cout lt lt sss lt
  • 如何注销多个非当前用户的会员用户?

    我正在使用属于 MVC2 默认项目一部分的 MembershipProvider 我希望能够获取用户名列表 注销用户 并在需要时销毁他们的会话 我能想到的最接近的是 foreach string userName in UserNames

随机推荐

  • 如何打印HttpResponse返回的消息?

    我的 Android 手机上有此代码 URI uri new URI url HttpPost post new HttpPost uri HttpClient client new DefaultHttpClient HttpRespon
  • 自定义rightBarButtonItem消失

    我在导航栏中有一个自定义 rightBarButtomItem 的奇怪错误 我有一个 TabBar 应用程序 如果应用程序已加载 按钮将显示正确 如果我单击选项卡 按钮将继续显示 如果我返回到已显示的选项卡之一 该按钮就会消失 最后 该按钮
  • 使用 python 从 HDFS 获取文件名列表

    这里是 Hadoop 菜鸟 我搜索了一些有关 hadoop 和 python 入门的教程 但没有取得太大成功 我还不需要使用映射器和缩减器进行任何工作 但这更多是一个访问问题 作为Hadoop集群的一部分 HDFS 上有一堆 dat 文件
  • 如何使用jquery打开选择输入

    所以我可以看到选择元素的选项 但我需要单击它 如果我想使用一个函数怎么办 当发生某些事情时 应该选择此选择元素 这意味着列表已打开并且我可以看到选项 我不希望用户单击选择元素 我想要其他东西来打开它 我尝试过的 select select
  • PHP readdir 和排序

    我正在做一个小画廊 我想从目录中读取文件名 并在删除一些前导数字和文件扩展名后打印下面的文件名 我有两个版本的代码 版本 1 不排序 current dir DOCUMENT ROOT weddings2 dir opendir curre
  • Android可扩展列表视图片段

    我正在寻找具有可扩展列表视图的片段 搜索后我发现了一个实现可扩展列表视图片段的类https gist github com 1316903 https gist github com 1316903 但我不知道如何使用它 请帮我 我尝试了列
  • MFMailComposeViewController、Swift 4、Xcode 9

    我的 MFMailComposeViewControllerDelegate 函数有问题 func mailComposeController controller MFMailComposeViewController didFinish
  • 仅根据邮政编码在 R 中绘制热图

    我想在 R 中绘制热图 但我的数据文件是这样的 Lat Long Zip Zvalue 我基本上需要在纬度和经度值之间进行插值 并根据 z 值绘制颜色 我怎样才能在 R 中做到这一点 我最终想要得到这样的东西 套餐spatstat是你的朋友
  • 使用 HelpProvider 类显示帮助,UI 始终位于帮助窗口后面

    我有一个使用 HelpProvider 类的 C Winforms 应用程序 每当我按 F1 调出帮助时 帮助窗口将始终位于我的应用程序顶部 我无法将我的应用程序 UI 带到前台 我仍然可以与我的 UI 交互 但帮助窗口将保留在顶部 这是
  • NetworkX:翻转图

    有没有办法以相反的顺序生成图形 即我想生成垂直翻转的图形 或者如果我可以在绘制之前用一些 matplotlib 子例程翻转它 F e 我希望 357 和 358 位于顶部 1 6 位于底部 只需交换您的位置坐标即可 import netwo
  • Flexbox 不包裹弹性项目

    我正在尝试使用 Flexbox 为我的网站设置布局 inb4 我不关心IE 但由于某种原因 这些物品没有包装 http jsfiddle net EnUuA http jsfiddle net EnUuA section display w
  • 如何将 lib 中的 jar 包含到 Netbeans 中的项目 jar 文件中?

    我正在使用一些 apache HttpClient jar 所以我将它们放在项目的 lib 目录中 当 Netbeans 编译项目时 它会复制 lib 并生成项目 jar 到 dist 目录中 但是当我使用 webstart 运行项目时 我
  • MySQL,其中 JSON 包含空数组

    如何在 JSON 列中搜索空数组 假设我有一个config有时 JSON 等于的列 tier WHERE JSON CONTAINS config tier 1 or WHERE JSON CONTAINS PATH config one
  • Dictionary 的下拉列表不适用于所选值

    我正在尝试以这种方式绑定 MVC3 中的下拉菜单 Model public static Dictionary
  • ImageIcon 不适用于我

    我编写了非常简单的代码来显示葡萄的图标 但代码仍然没有向我显示任何内容 这是我的代码 import javax swing import java awt public class Code ImageIcon ii new ImageIc
  • 使用 libsoup 进行 HTTP POST

    我想使用 libsoup 执行一个简单的 POST 请求 我想要发送数据的网站的 api 只需要一个名为 内容 的字段 使用curl我这样做 curl si F content mycontent http mywebsite org ap
  • 我可以使用什么正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址?

    我可以使用什么正则表达式来匹配以点十进制表示法表示的任何有效 IP 地址 if ip d 1 3 d 1 3 d 1 3 d 1 3 1 lt 255 2 lt 255 3 lt 255 4 lt 255 print valid n els
  • 如何使用 Jade 和 Node.js 迭代 JSON 数组

    所以我有这个 JSON 数组apiData被传递到视图作为data Backend router get function req res var data JSON stringify apiData res render gallery
  • 将 LINQ 序列中的项目发送到返回 void 的方法

    通常 当我处理 LINQ 序列时 我希望将每个项目发送到返回 void 的方法 从而避免 foreach 循环 但是 我还没有找到一种优雅的方法来做到这一点 今天 我写了如下代码 private StreamWriter sw privat
  • SimpleInjector 和 FluentValidationFactory

    我正在尝试自动化视图模型的验证 我知道我可以添加一个属性来指定我的验证 但有一个选项可以设置一个工厂来自动化所有这些 我查看了 这个答案 https stackoverflow com questions 9984144 what is t