我有一个ValidationAttribute看起来像这样:

public class RegistrationUniqueNameAttribute : ValidationAttribute
{
    public IRepository<User> UserRepository { get; set; }

    public override bool IsValid(object value)
    {
       //use UserRepository here....
    }
}


在我的容器设置中(在应用启动时),我有以下内容:

        builder.Register(c => new RegistrationUniqueEmailAttribute
            {
                UserRepository = c.Resolve<IRepository<User>>()
            });


但是,在调试时,UserRepository的值始终为null,因此不会注入该属性。

我的容器设置有误吗?

我真的不想使用DependencyResolver.Current.GetService<IRepository<User>>(),因为这不是可测试的...

最佳答案

不,Autofac v3对ValidationAttribute和朋友[[cc>做很多强大的事情,例如,使用过滤器属性]没什么特别的事情。

我间接地in this answer解决了这个问题,使它可以编写:

class MyModel
{
    ...
    [Required, StringLength(42)]
    [ValidatorService(typeof(MyDiDependentValidator), ErrorMessage = "It's simply unacceptable")]
    public string MyProperty { get; set; }
    ....
}

public class MyDiDependentValidator : Validator<MyModel>
{
    readonly IUnitOfWork _iLoveWrappingStuff;

    public MyDiDependentValidator(IUnitOfWork iLoveWrappingStuff)
    {
        _iLoveWrappingStuff = iLoveWrappingStuff;
    }

    protected override bool IsValid(MyModel instance, object value)
    {
        var attempted = (string)value;
        return _iLoveWrappingStuff.SaysCanHazCheez(instance, attempted);
    }
}


(以及一些帮助程序类,它们连接到ASP.NET MVC ...)

关于inversion-of-control - 具有ValidationAttribute的Autofac属性注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15879967/

10-11 06:00