C# 带FluentValidation的StructureMap

C# 带FluentValidation的StructureMap,c#,asp.net-core,fluentvalidation,C#,Asp.net Core,Fluentvalidation,我正在使用结构图作为.net核心项目中的DI框架。 我的fluentValidation注册如下: public class DefaultRegistry : Registry { public DefaultRegistry() { Scan(o => { o.AssemblyContainingType<Startup>(); o.AddAllTypesOf<IValid

我正在使用结构图作为.net核心项目中的DI框架。 我的fluentValidation注册如下:

public class DefaultRegistry : Registry
{
    public DefaultRegistry()
    {
        Scan(o =>
        {
            o.AssemblyContainingType<Startup>();
            o.AddAllTypesOf<IValidator>();
            o.LookForRegistries();
            o.AddAllTypesOf<Profile>();
            o.WithDefaultConventions();
        });
    }
}
public类DefaultRegistry:Registry
{
公共注册处()
{
扫描(o=>
{
o、 AssemblyContainingType();
o、 AddAllTypesOf();
o、 查找注册表();
o、 AddAllTypesOf();
o、 使用默认约定();
});
}
}
抛出错误:

我从AbstractValidator继承了validator类:

public class DefaultValidator : AbstractValidator<DefaultViewModel>
公共类DefaultValidator:AbstractValidator
DI在我只有一个验证器类时工作,一旦我创建了第二个类,它就会崩溃

我还使用程序集搜索为验证器注册所有实例:

services
                .AddMvc()
                .AddFluentValidation(x=>x.RegisterValidatorsFromAssemblyContaining<Startup>())
服务
.AddMvc()
.AddFluentValidation(x=>x.RegisterValidatorsFromAssemblyContaining())

使用自定义验证器工厂解决问题

实现了FluentValidation接口IValidatorFactory和injected StructureMap IContainer

using System;
using System.Reflection;
using FluentValidation;
using StructureMap;

namespace Business.Managers.Interfaces
{
    public class FluentValidatorFactory : IValidatorFactory
    {
        private readonly IContainer _container;

        public FluentValidatorFactory(IContainer container)
        {
            _container = container;
        }
        public IValidator<T> GetValidator<T>()
        {
            return (IValidator<T>)GetValidator(typeof(T));
        }

        public IValidator GetValidator(Type type)
        {
            IValidator validator;

            try
            {
                validator = CreateInstance(typeof(IValidator<>).MakeGenericType(type));
            }
            catch (Exception)
            {
                // Get base type and try to find validator for base type (used for polymorphic classes)
                var baseType = type.GetTypeInfo().BaseType;
                if (baseType == null)
                {
                    throw;
                }

                validator = CreateInstance(typeof(IValidator<>).MakeGenericType(baseType));
            }

            return validator;
        }

        public IValidator CreateInstance(Type validatorType)
        {
            return _container.GetInstance(validatorType) as IValidator;
        }
    }
}
使用系统;
运用系统反思;
使用FluentValidation;
使用结构图;
命名空间Business.Managers.Interfaces
{
公共类FluentValidatorFactory:IValidatorFactory
{
专用只读IContainer\u容器;
公共FluentValidator工厂(IContainer容器)
{
_容器=容器;
}
公共IValidator GetValidator()
{
返回(IValidator)GetValidator(typeof(T));
}
公共IValidator GetValidator(类型)
{
IValidator验证器;
尝试
{
validator=CreateInstance(typeof(IValidator).MakeGenericType(type));
}
捕获(例外)
{
//获取基类型并尝试查找基类型的验证器(用于多态类)
var baseType=type.GetTypeInfo().baseType;
if(baseType==null)
{
投掷;
}
validator=CreateInstance(typeof(IValidator).MakeGenericType(baseType));
}
返回验证器;
}
公共IValidator CreateInstance(类型验证器类型)
{
将_container.GetInstance(validatorType)返回为IValidator;
}
}
}
还通过自定义服务解析正确的验证器:

using FluentValidation;
using FluentValidation.Results;

namespace Business.Managers.Interfaces
{
    public class ValidationManager : IValidationManager
    {
        private readonly IValidatorFactory _validatorFactory;

        public ValidationManager(IValidatorFactory validatorFactory)
        {
            _validatorFactory = validatorFactory;
        }

        public ValidationResult Validate<T>(T entity) where T : class
        {
            var validator = _validatorFactory.GetValidator(entity.GetType());
            var result = validator.Validate(entity);
            return result;
        }
    }
}
使用FluentValidation;
使用FluentValidation。结果;
命名空间Business.Managers.Interfaces
{
公共类验证管理器:IValidationManager
{
私有只读IValidatorFactory(IValidatorFactory);
公共验证经理(IValidatorFactory验证工厂)
{
_验证器工厂=验证器工厂;
}
公共验证结果验证(T实体),其中T:class
{
var validator=_validatorFactory.GetValidator(entity.GetType());
var结果=验证器。验证(实体);
返回结果;
}
}
}
在startup.cs中使用AddFluentValidation注册验证程序

services.AddMvc().AddFluentValidation(x=>x.RegisterValidatorsFromAssemblyContaining<LoansRequestValidator>());
services.AddMvc().AddFluentValidation(x=>x.RegisterValidatorsFromAssemblyContaining());

验证程序是单例的,将它们注册为transienttha不能解决问题