Silverlight и контейнер Unity – внедрение свойства и метода

Использование внедрения свойства и метода с Silverlight 3

•    Скачать исходники - 221.3 Кб

В данной статье показано внедрение свойства (и внедрение метода) с помощью контейнера Unity.

Код для этой статьи был написан с помощью Silverlight 3 и Блока приложения Unity 1.2 для Silverlight. XAML(расширяемый язык разметки приложений) и его вывод очень похожи на предыдущую статью (о внедрении конструктора). Большинство упомянутых здесь идей также похожи на предыдущую статью.

Использование кода

Два добавляемых числа представлены в виде интерфейсов в примере кода. Затем эти интерфейсы реализованы в двух классах Число (каждый один класс для чисел).

//Интерфейс
public interface INumberA {
    int NumA {get;set;}
}
//Число
public class NumberA:INumberA {
    private int intNumA;
    public int NumA
    {
        get {return intNumA;}
        set { intNumA = value; }
    }
}

Класс Total(сумма) в этот раз не содержит конструктор. Вместо этого он содержит два свойства. Эти свойства на самом деле являются интерфейсами Число, от которых зависит сумма.
Здесь важен атрибут Зависимость. Он говорит Unity, от каких типов зависит этот класс.

//Внедрение свойства
[Dependency()]
public INumberA PropNumA { get { return this.objA; } set { this.objA = value; } }

// Внедрение свойства
[Dependency()]
public INumberB PropNumB { get { return this.objB; } set { this.objB = value; } }

Если бы использовалось внедрение метода, этот код выглядел бы так:

 [InjectionMethod]
public void initialize(INumberA objA, INumberB objB) {
   this.objA = objA;
   this.objB = objB;
}

Создан метод с атрибутом InjectionMethod. Устанавливаются зависимости для двух  параметров.
Класс Total также реализует интерфейс INotifyPropertyChanged и несколько свойств, используемых в связывании с XAML.

public int Sum {
    get {
    return intSum;
    }
    set {
        if (intSum != value) {
            intSum = value;
            OnPropertyChanged("Sum");
        }
    }
}
public int NumA {
    get {
        return objA.NumA;
    }
    set {
        if (objA.NumA != value) {
            objA.NumA = value;
            OnPropertyChanged("NumA");
            GetSum(objA.NumA, NumB);
        }
    }
}
public int NumB {
    get {
        return objB.NumB;
    }
    set {
        if (objB.NumB != value) {
            objB.NumB = value;
            OnPropertyChanged("NumB");
            GetSum(NumA, objB.NumB);
        }
    }
}

private void GetSum(int num1, int num2)
{
    Sum = objA.NumA + objB.NumB;
}

Мало что меняется в коде xaml.cs после файла.

IUnityContainer container = new UnityContainer()
//Используются интерфейсы – поэтому регистрируется правильный тип
.RegisterType<INumberA, NumberA>()
.RegisterType<INumberB, NumberB>();
//Unity создает экземпляры всех зависимых классов
this.DataContext = container.Resolve<Total>();

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

Особенности

Заметьте, что ничего не меняется в MainPage.xaml.cs, т.е. независимо от того, какой стиль внедрения используется, для этого примера клиент не меняется.