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; 
     } 
    } 
} 

Мой торговец репо всегда пустой.

Edit:

Это часть моей точки зрения модели регистрации

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? –

+0

@TravisIllig Это 'ValidationAttribute'; если я не пропущу что-то большое после тщательного поиска, Autofac не делает ничего конкретного, чтобы обеспечить их .... я? –

+0

Да, вы правы, он работает только с фильтрами действий. – ThunderDev

ответ

3

Я решил свою проблему с помощью DependencyResolver класс в ASP.NET MVC.

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

Единственный способ для меня. У меня есть проект веб-API – Chintsu

1

Я решил это таким образом, что не в конечном итоге засоряя код с с Serice Адрес 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)); 
Смежные вопросы