4

我发现了这个问题的几个问题,但还没有找到一个干净和简单的解决方案。Autofac属性注入与MVC ValidationAttribute

这是我在做什么(使用Autofac 3.3.0)登记

builder.RegisterType<MerchantRepo>().As<IMerchantRepo>().PropertiesAutowired(); 

这是我的验证类

public class MerchantMustBeUniqueAttribute : ValidationAttribute 
{ 
    public IMerchantRepo MerchantRepo { get; set; } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     int merchantId = Convert.ToInt32(value); 

     if (MerchantRepo.Exists(merchantId)) 
     { 
      return new ValidationResult(ErrorMessage); 
     } 
     else 
     { 
      return ValidationResult.Success; 
     } 
    } 
} 

我的商家回购总是空。

编辑:

这是我的视图模型

public class MerchantCreationModel 
{ 
    [Required] 
    [MerchantMustBeUnique(ErrorMessage = "Already exists!")] 
    public int? NewMerchantId { get; set; } 
} 

Autofac注册

public static void RegisterDependencies() 
{ 
    var builder = new ContainerBuilder(); 

    builder.RegisterFilterProvider(); // Inject properties into filter attributes 
    builder.RegisterControllers(typeof(MvcApplication).Assembly); 

    builder.RegisterType<MerchantRepo>().As<IMerchantRepo>().PropertiesAutowired(); 

    IContainer container = builder.Build(); 
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
} 
+0

你能告诉你如何应用验证属性,并显示其他注册,在那里你注册Autofac过滤器提供什么样的? – 2014-09-24 16:06:51

+0

@TravisIllig这是一个'ValidationAttribute';除非在彻底搜索之后我失去了一些大的东西,Autofac没有做任何具体的提供这些....我是吗? – 2016-02-04 18:10:18

+0

是的,你是正确的,它只适用于行动过滤器 – ThunderDev 2016-02-04 18:19:27

回答

3

我使用ASP.NET MVC的DependencyResolver类解决我的问题的一部分。

IMerchantRepo repo = DependencyResolver.Current.GetService<IMerchantRepo>(); 
+0

唯一的办法对我来说。我有一个Web API项目 – Chintsu 2015-09-18 15:58:30

1

我解决它在不结束了与贡献莫过于位置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像这样在Global.asax: -

DataAnnotationsModelValidatorProvider.RegisterAdapterFactory(
    typeof(ValidatorServiceAttribute), 
    (metadata, context, attribute) => 
     new DataAnnotationsModelValidatorEx(metadata, context, attribute, true));