65.9K
CodeProject 正在变化。 阅读更多。
Home

Silverlight 和 Unity 容器 - 属性和方法注入

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2009 年 8 月 28 日

CPOL

1分钟阅读

viewsIcon

21162

downloadIcon

188

在 Silverlight 3 中使用属性和方法注入

引言

在本文中,将演示属性注入(和方法注入)。这将使用 Unity 容器来实现。

背景

本文的代码是使用 Silverlight 3 和 Unity Application Block 1.2 for Silverlight 编写的。XAML 及其输出与之前的文章(关于构造函数注入)非常相似。这里提到的大多数概念也与 较早的 文章类似。

Using the Code

再次说明,在示例代码中,将被相加的两个数字表示为接口。然后我们在两个数字类中实现这些接口(每个数字一个)。

//Interface
public interface INumberA {
    int NumA {get;set;}
} 
//Number
public class NumberA:INumberA {
    private int intNumA;
    public int NumA
    {
        get {return intNumA;}
        set { intNumA = value; }
    }
}

这次的 Total 类不包含构造函数。相反,它包含两个属性。这些属性实际上是 Total “依赖”的数字接口。

Dependency 属性在这里很重要。它告诉 Unity 这个类依赖于哪些类型。

//Property Injection
[Dependency()]
public INumberA PropNumA { get { return this.objA; } set { this.objA = value; } }

//Property Injection
[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()
//Interfaces used - so register the correct type
.RegisterType<INumberA, NumberA>()
.RegisterType<INumberB, NumberB>();
//Unity takes care of instantiation of all dependent classes
this.DataContext = container.Resolve<Total>();

在运行应用程序并在网页上输入数字后,将显示并计算总数。

关注点

请注意,MainPage.xaml.cs 中没有任何变化,也就是说,对于此示例,无论使用哪种注入风格,客户端都保持不变。

历史

  • 初始修订版 - 2009 年 8 月 23
© . All rights reserved.