2013-09-16 4 views
0

У меня есть cms со страницей, которая содержит формы.Вставить интерфейс в класс?

Я хочу, чтобы в cms было выпадающее меню с разными именами классов, которые реализуют интерфейс проверки.

Мои обработчики формы содержат метод процесса, который я хочу проверить для выбранного класса проверки.

Так что у меня этот интерфейс:

public interface IEligibilityValidation 
{ 
    bool IsValid(); 
} 

и, например, этот класс

public class ComplexEligibilityValidation : IEligibilityValidation 
{ 
    public bool IsValid() 
    { 
     return true; /* complex logic here */ 
    } 
} 

public class SimpleEligibilityValidation : IEligibilityValidation 
{ 
    public bool IsValid() 
    { 
     return true; /* less complex logic here */ 
    } 
} 

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

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

Например:

public class SampleFormHandler : IEligibilityValidation 
{ 
    public SimpleFormHandler(FormViewModel model, INode node) 
    { 
     this.model = model; 
     this.node = node; 

     eligiblityValidationClass = GetPropertyValue("eligibilityValidation"); 

    } 

    public SampleProcessResult Process() 
    { 
      if (!string.IsNullOrEmpty(eligiblityValidationClass)) 
      { 
       var thisType = Type.GetType(eligiblityValidationClass); 
       var thisInstance = Activator.CreateInstance(thisType); 
       var isValid = ((IEligibilityValidation)thisInstance).IsValid(); 
       /* Works however, I need the IsValid to have access to a the FormHandler's properties and injected services */ 
      } 

    } 

    public bool IsValid() 
    { 
     /* Will Always be ignored */ 
     return true; 
    } 
} 

Самый элегантный способ сделать что-то вроде этого?

Идея состоит в том, что разные FormHandlers будут иметь другой класс проверки, назначенный им, и при вызове метод IsValid сможет использовать свойства этой формы.

Я ищу некоторую расширенную архитектуру или что-то более умное, чем просто требующий ненужного кода.

Благодаря

+0

Почему вы хотите конвертировать 'SampleFormHandler' в' desiredType' назвать 'IsValid', вместо того, чтобы просто позвонить' this.IsValid', я что-то отсутствует? –

+0

this.IsValid вызовет реализацию текущего класса. Я хочу использовать реализацию IsValid GUID класса, которую я предоставляю. Поэтому иногда это будет SimpleEligibilityValidation, иначе это будет ComplexEligibilityValidation или какой-то другой класс, который реализует IEligibilityValidation. Выбираете, какая проверка должна использоваться в свойствах формы. – Nick

+0

Насколько я понимаю, вы хотите создать динамический объект-валидатор, например, Activato.CreateInstance', но 'IsValid'method как получить данные для проверки? –

ответ

0

SampleFormHandler не должен реализовывать интерфейс. Если я правильно понимаю ваш дизайн, вам нужно создать экземпляр динамически определенного типа, а затем передать объект в интерфейс IEligibilityValidation.

public SampleProcessResult Process() 
{ 
    if (eligiblityValidationClass != Guid.Empty) 
    { 
     Type validatorType = Type.GetTypeFromCLSID(eligiblityValidationClass); 
     IEligibilityValidation validator; 
     try 
     { 
      validator = Activator.CreateInstance(validatorType) as IEligibilityValidation; 
     } 
     catch (COMException) 
     { 
      // The class doesn't exist, or instance failed to be created 
      // for some other reason. 
     } 

     if (validator == null) 
     { 
      // The class exists, but it doesn't implement the interface. 
     } 

     bool isValid = validator.IsValid(); 
    } 
} 
+0

Да, это очень близко к тому, что у меня есть прямо сейчас. Я также удалил интерфейс из обработчика формы. Однако как мне получить «IsValid» для работы с этими свойствами обработчика формы? Не знаете, как это будет работать без необходимости прохождения длинного списка параметров. – Nick

+0

Предполагаю, вы имеете в виду текущие значения в форме? Мне кажется, что вы должны передавать объект ViewModel или какой-либо другой объект, содержащий текущие свойства, в метод IsValid на 'IEligibilityValidation'. –

+0

Различные классы проверки будут иметь различный набор свойств и сервисов, поэтому его нельзя передать в метод IsValid – Nick

0

вы слышали о гипсе (как, есть)? Casting and Type Conversions (C# Programming Guide)

И класс SampleFormHandler не имеет реализация IEligibilityValidation

все равно ((IEligibilityValidation) этого) .IsValid() вам решение

UPDATE:

Таким образом, вы должны создать экземпляр тип, который вы хотите выполнить с помощью IsValid. Таким образом,

var desiredInstance = Activator.CreateInstance(desiredType); 
var validationDesired = desiredInstance as IEligibilityValidation; 
if(validationDesired != null){ 
validationDesired.IsValid(); 
} 
+0

Это так, но я не добавил его в образец. Я добавил его сейчас, но, как вы видите, это бесполезно. Реализация будет зависеть от типа выбранного класса, поэтому реализация внутри класса всегда будет игнорироваться. Вот почему я ищу элегантное решение, которое, возможно, не потребует его. Что вы предлагаете, это то, что я уже делаю, и это вы набрали: ((IEligibilityValidation) this) .IsValid() кажется мне неправильным – Nick

+0

Это почти то, что у меня уже есть. Проблема в том, что метод «IsValid» в зависимости от того, какой класс проверки я использую, должен иметь доступ к свойствам обработчика формы и введенным свойствам, чтобы выполнить проверку. – Nick

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