【问题标题】:Autofac property injection with ValidationAttribute带有 ValidationAttribute 的 Autofac 属性注入
【发布时间】:2013-03-30 14:04:00
【问题描述】:

我有一个如下所示的 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&lt;IRepository&lt;User&gt;&gt;(),因为这不是可测试的......

【问题讨论】:

  • ValidationAttributes 不是由 Autofac 创建的。 CLR 本身负责创建它们。
  • 这个问题暗示它应该工作? stackoverflow.com/questions/12505245/…
  • 这仅在您覆盖默认 DataAnnotationsModelValidator 时有效,但我在 Autofac 源代码或在线中找不到任何相关信息。也许我错过了什么。
  • @Steven 不,你没有遗漏任何东西。在经历了类似的野鹅追逐之后,我用 cmets 装饰了这个冒犯性的问题。

标签: inversion-of-control autofac


【解决方案1】:

不,Autofac v3 对 ValidationAttribute 和朋友们没有做任何特别的事情 [Autofac.Mvc 做了很多强大的事情,例如过滤器属性]。

我间接解决了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...)

【讨论】:

    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多