2013-12-24 4 views
3

У меня есть специальный ValidationAttribute, он проверяет, существует ли еще один пользователь. Для этого ему нужен доступ к моему уровню доступа к данным, экземпляр, введенный в мой контроллер UnityКак передать параметры в ValidationAttribute?

Как передать это (или что-нибудь в этом отношении) в качестве параметра в свой пользовательский валидатор?

Возможно ли это? т.е. там, где я создаю Даль, который должен быть параметра Я

public class EmailIsUnique : ValidationAttribute 
    { 
     private string _errorMessage = "An account with this {0} already exists"; 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      DataAccessHelper Dal = new DataAccessHelper(SharedResolver.AppSettingsHelper().DbConnectionString); //todo, this is way too slow 
      bool isValid = true; 
      if(value == null) { 
       isValid = false; 
       _errorMessage = "{0} Cannot be empty"; 
      } else { 
       string email = value.ToString(); 
       if (Dal.User.FindByEmail(email) != null) 
       { 
        isValid = false; 
       } 
      } 

      if (isValid) 
       return ValidationResult.Success; 
      else 
       return new ValidationResult(String.Format(_errorMessage, validationContext.DisplayName)); 
     } 
    } 

ответ

2

Я не уверен, что вы сможете передать параметры выполнения в свой атрибут.

Вы можете использовать DependencyResolver.Current.GetService<DataAccessHelper>(), чтобы решить ваши декалитры (учитывая то, что вы зарегистрировали DataAccessHelper)

Вы, вероятно, более вероятно, зарегистрировали DataAccessHelper в IDataAccessHelper или что-то? в этом случае вы бы назвали GetService<IDataAccessHelper>

public class EmailIsUnique : ValidationAttribute 
{ 
    private string _errorMessage = "An account with this {0} already exists"; 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     IDataAccessHelper Dal = DependencyResolver.Current.GetService<IDataAccessHelper>(); // too slow 
     bool isValid = true; 
     if(value == null) { 
      isValid = false; 
      _errorMessage = "{0} Cannot be empty"; 
     } else { 
      string email = value.ToString(); 
      if (Dal.User.FindByEmail(email) != null) 
      { 
       isValid = false; 
      } 
     } 

     if (isValid) 
      return ValidationResult.Success; 
     else 
      return new ValidationResult(String.Format(_errorMessage, validationContext.DisplayName)); 
    } 
} 

или

public class EmailIsUnique : ValidationAttribute 
{ 
    [Dependency] 
    public IDataAccessHelper DataAccess {get;set;} 

    private string _errorMessage = "An account with this {0} already exists"; 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 

     bool isValid = true; 
     if(value == null) 
     { 
      isValid = false; 
      _errorMessage = "{0} Cannot be empty"; 
     } 
     else 
     { 
      string email = value.ToString(); 
      if (DataAccess.User.FindByEmail(email) != null) 
      { 
       isValid = false; 
      } 
     } 

     if (isValid) 
      return ValidationResult.Success; 
     else 
      return new ValidationResult(String.Format(_errorMessage, validationContext.DisplayName)); 
    } 
} 
+0

Извините, я думаю, мой код немного запутан. Мне нужно избавиться от шаблона локатора службы здесь, потому что он находится в отдельном проекте, который должен получать только зависимости. Похоже, мне, возможно, придется перенести это из атрибута на какой-то пользовательский код. Спасибо Джеймсу, оцените его! – Baconbeastnz

+1

Если это так, вы можете рассмотреть абстрагирование своего DAL с помощью интерфейса, зарегистрировав этот интерфейс с вашим контейнером IoC и используя инъекцию свойств, указав [Dependency] над свойством IDataAccesHelper в вашем атрибуте? – Jamez

+0

Да! Я только придумал ту же самую стратегию в моей голове, выйдя на улицу (первая часть в любом случае!). Re 2-я часть, которая потрясающе, я не знал об Unity, спасибо! – Baconbeastnz

0

yes.you может передать параметр, который используют в классе модели, как показано ниже:

[EmailIsUnique()] 
public string Email {get; set;} 

так что это будет автоматически переходить на e-mail как и проверьте значение.

+0

К сожалению Vaibhav, я не после этого, я после динамических переменных инъекционного из вне модели – Baconbeastnz

1

Возможно, вы ищете Инъекцию недвижимости. Взгляните на сообщение this. Первым решением является создание собственного поставщика фильтров, который поддерживает инъекцию зависимостей.

Второе решение - использовать шаблон Service Locator и получить экземпляр вашей службы в конструкторе атрибутов.

+0

Спасибо. Я использую шаблон Service Locator, к сожалению, хотя я просто перенес свои модели в проект DataAccess. (для разделения проблем), и этот проект не должен иметь собственный локатор Serivce. Похоже, ваша ссылка может помочь много, спасибо! – Baconbeastnz

Смежные вопросы