Silverlight 和 Unity 容器 - 属性和方法注入
在 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日