2015-03-24 4 views
0

У меня есть приложение, в котором я пытаюсь сохранить доступ к данным и пользовательский интерфейс отдельно. Для этого у меня есть два проекта: один для пользовательского интерфейса и один для доступа к данным. У меня проблема заключается в том, как эффективно передавать данные, полученные из файла конфигурации в проекте пользовательского интерфейса, в классы в проекте доступа к данным.Предпочтительный способ передать свойство между классами

Проект доступа к данным содержит два класса ...

  1. PaymentProcessor.cs
  2. Payment.cs

    Класс PaymentProcessor заботится о создании запроса на Web API, чтобы получить коллекцию Объекты «Оплата». Мне нужно передать строку в объект «Платеж», чтобы она могла использовать строку, чтобы увидеть, присутствует ли в платете конкретный шаблон.

    Каков наилучший способ передать эту строку в класс оплаты? Создать свойство класса PaymentProcessor и передать его как свойство в классе Payment? Кажется, я играю «передаю собственность». Есть лучший способ сделать это?

Вот пример кода, показывающий, как я использую классы и как передаю «ValidationString».

// Code to execute in UI 
var payProccessor = new PaymentProcessor(); 
payProccessor.ValidationStringToPass = "ABCDEFG"; 
payProccessor.ProcessPayment(); 

public class PaymentProcessor() 
{ 
    public string ValidationStringToPass {get; set;} 

    public void ProcessPayment() 
    { 
    // Get payment object collection 
    List<Payment> paymentCollection = GetPayments(); 

    foreach(Payment p in paymentCollection) 
    { 
     p.ValidationString = this.ValidationStringToPass; 
     p.DoStuff(); 
    } 
    } 
} 

public class Payment 
{ 
    string ValidationString {get; set;} 

    public void DoStuff() 
    { 
    // do stuff with the ValidationString 
    } 
} 
+0

Оплата - объект домена, третий уровень - это вы. Если вы сохраняете свои объекты данных в datalayer, тогда вы получите графический интерфейс, полностью зависящий от datalayer. –

+0

Как вы собираетесь передавать информацию на слой данных, не создавая эту зависимость? Должен ли я иметь доступ к файлу данных напрямую? – webworm

ответ

1

Это один из способов сделать это с использованием DependencyProperties и привязок.

сделать свой класс взносом DependencyObject

public class Payment : DependencyObject 
{ 
    public static readonly DependencyProperty ValidationStringProperty = 
      DependencyProperty.Register("ValidationString", typeof(string), typeof(Payment), new PropertyMetadata(new PropertyChangedCallback(OnValidationStringChanged))); 
    public string ValidationString 
    { 
     get { return (string)this.GetValue(Payment.ValidationStringProperty); } 
     set 
     { 
      this.SetValue(Payment.ValidationStringProperty, value); 
     } 
    } 

    private static void OnValidationStringChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     // do stuff all that stuff you wanted to do ValidationString 
    } 
} 

Тогда же PaymentProcessor реализовать INotifyPropertyChanged

public class PaymentProcessor : INotifyPropertyChanged 
{ 
    public PaymentProcessor() 
    { 
    } 
    private string _validationStringToPass; 
    public string ValidationStringToPass 
    { 
     get { return _validationStringToPass; } 
     set 
     { 
      _validationStringToPass = value; 
      OnPropertyChanged("ValidationStringToPass"); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
    //Get your payments here, might want to put this in the constructor 
    public void GetPayments() 
    { 
     Binding bind = new Binding() { Source = this, Path = new PropertyPath("ValidationStringToPass") }; 
     Payment pay = new Payment(); 
     BindingOperations.SetBinding(pay, Payment.ValidationStringProperty, bind); 
     Payment pay1 = new Payment(); 
     BindingOperations.SetBinding(pay1, Payment.ValidationStringProperty, bind); 
    } 
} 

Затем в коде пользовательского интерфейса вы можете сделать следующее

var payProccessor = new PaymentProcessor(); 
    payProccessor.GetPayments(); 
    payProccessor.ValidationStringToPass = "ABCDEFG"; 

и когда-либо вам измените свойство ValidationStringToPass в своей платежной программе cessor он обновит свойство ValidationString в ваших Платежах, которые вы связали в методе GetPayments.

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