快捷搜索:

[EntLib]微软企业库5.0 学习之路——第十步、使用

继承进修Unity,在前几篇中已经将Unity的应用措施做了一个还算具体的先容了,主如果若何经由过程代码及设置设置设备摆设摆设文件来注册工具之间的关系、Unity内置所有的生命周期治理应用先容,及Unity的Register和Resolve的一些高档利用。经由过程在PART1——为什么要应用Unity?的进修我们知道Unity可以帮我们简化并治理工具之间的关系(也便是前几篇所先容的),而本日则要先容Unity的别的一个紧张功能——DI(依附注入)。

本篇文章将主要先容:

1、构造函数注入。

2、属性注入。

3、措施注入。

4、应用设置设置设备摆设摆设完成各类注入。

5、对已经创建工具进行注入。

一、构造函数注入

在有些时刻,我们所编写的类中的构造函数都邑包孕对其他工具的引用,如下代码:

public Subject2(MyClass myClass1,MyClass myClass2)

{

myClass1.Name = "班级1";

myClass2.Name = "班级2";

}

可以看到这个构造函数有2个参数,都依附于MyClass类,假如一样平常环境下想要调用,我们老是必要实现构建好2个myclass工具,以是相对来说对照麻烦,而假如应用Unity来调用就会方便许多,如下代码:

container.Resolve();

仅仅一行既可,Unity容器会自动帮我们构建好所需的依附工具实例。

当然这个只是简单的应用,在实际的环境下我们不会这么编写代码,我们不会直接引用工具,而是直接引用接口,这样可以解除代码的耦合性,如下代码:

public Subject2(IClass myClass1)

{

myClass1.Name = "班级1";

}

这样Subject2类的构造函数仅仅依附于IClass接口,并依附于详细的实现类,这种环境下,假如想调用的话,必要实现注册好工具之间的关系,如下代码:

public static void ConstructorInjection()

{

//container.Resolve();

container.RegisterType();

container.Resolve();

}

经由过程Unity容器工具的获取工具时刻默认老是获取非命名默认注册工具,然则假如调用Subject2的构造函数参数我想指定详细的工具时怎么办?

这时就必要应用Dependency这个特点类来办理了,在必要特殊指定的依附关系的参数上加上Dependency特点,并为Dependency指定好参数name(此name参数表示注册工具关系时所指定的名称),代码如下:

public Subject2([Dependency("your")]

IClass classInfo)

{

classInfo.Name = "班级1";

}

调用代码:

container.RegisterType()

.RegisterType("your");

container.Resolve();

可以看到,我对IClass注册了2个工具,而我在Subject2的构造函数参数上应用了Dependency特点指定了ClassInfo参数获取注册名为“your”的工具。

现在还有一个问题,便是当一个类存在多个构造函数的时刻,我们若何区分哪个构造函数必要实现注入,哪个不必要?

这时就可以应用InjectionConstructor特点来标识,代码如下:

[InjectionConstructor]

public Subject2([Dependency("your")]

IClass classInfo)

{

classInfo.Name = "班级1";

}

public Subject2(IClass classInfo1, IClass classInfo2)

{

classInfo1.Name = "班级1";

classInfo2.Name = "班级2";

}

Unity只会调用标识了InjectionConstructor特点的构造函数,这样就很好的办理了多构造函数的环境下,Unity调用哪个构造函数。

二、属性注入

属性注入和构造函数注入类似,只需在必要注入的属性上增添一个Dependency特点,同样的也可以为Dependency指定一个name参数用来指定注入属性的详细工具,如下代码,在Subject属性上增添了Dependency特点,来表示这个属性必要注入:

public class MyClass : IClass

{

public MyClass()

{

}

public void ShowInfo()

{

Console.WriteLine("这个是我的班级");

}

[Dependency("Subject1")]

public ISubject Subject { get; set; }

public string Name { get; set; }

public string Description { get; set; }

}

详细的调用代码:

public static void PropertyInjection()

{

container.RegisterType("Subject1")

.RegisterType();

var classInfo = container.Resolve();

Console.WriteLine(classInfo.Subject.Name);

}

这样ClassInfo的Subject属性自动关联到了Subject1类上(完成了属性注入),造访classInfo.Subject.Name可以获得“科目1”。

三、措施注入

措施注入同样只需在必要注入的措施上增添一个特点——InjectionMethod既可(其应用措施也和构造注入类似),这样Unity会自动帮我们完成注入,措施注入和构造注入一样,同样可以在措施的参数上指定Dependency特点来指定参数所依附的注册,下面的类代码中包孕了构造注入、属性注入及措施注入,这边聚拢在一路展示相对来说直不雅一些:

public class MyClass : IClass

{

public MyClass()

{

}

public MyClass(ISubject subjectInfo)

{

this.TempSubject1 = subjectInfo;

}

public void ShowInfo()

{

Console.WriteLine("构造注入成功后临时科目1名称:" + this.TempSubject1.Name);

Console.WriteLine("属性注入成功后临时科目名称:" + this.Subject.Name);

Console.WriteLine("措施注入成功后临时科目2名称:" + this.TempSubject2.Name);

}

[InjectionMethod]

public void Init(ISubject subjectInfo)

{

TempSubject2 = subjectInfo;

}

[Dependency("Subject1")]

public ISubject Subject { get; set; }

public ISubject TempSubject1 { get; set; }

public ISubject TempSubject2 { get; set; }

public string Name { get; set; }

public string Description { get; set; }

}

详细的调用代码:

public static void MethodInjection()

{

container.RegisterType("Subject1")

.RegisterType();

container.RegisterType();

var classInfo = container.Resolve();

classInfo.ShowInfo();

}

效果图如下:

4、应用设置设置设备摆设摆设完成各类注入

上面所演示的代码都是经由过程代码来完成工具的注入,下面演示下若何经由过程设置设置设备摆设摆设文件来设置设置设备摆设摆设这些注入,详细设置设置设备摆设摆设代码如下:

代码如下:

public static void DIConfiguration()

{

//获取特定设置设置设备摆设摆设节下已命名的设置设置设备摆设摆设节下的设置设置设备摆设摆设信息

container.LoadConfiguration("Third");

var classInfo = container.Resolve();

classInfo.ShowInfo();

}

详细的效果是和上面截图中是一样的,只不过这边的依附注入是经由过程设置设置设备摆设摆设文件来实现的。

5、对已经创建工具进行注入

一样平常来说假如想实现依附注入必要经由过程Unity容器来进行工具注册,然后经由过程Unity容器来获取工具,然则假如工具已经存在(便是不是经由过程Unity容器来获取的工具),这时若何来经由过程Unity来实现对已有的工具进行依附注入呢?

Unity容器已经为我们供给好了这种环境的办理法子,便是BuildUp措施,看下下面的代码就能明白了:

public static void BuildUp()

{

//事先注册好ISubject和MySubject之间的关系

//并指定一个名称以方便在接口中的属性上利用[Dependency("Subject1")]特点

//详细请见IDemo.IClass

container.RegisterType("Subject1");

IClass classInfo = new MyClass();

IClass classInfo2 = container.BuildUp(classInfo);

Console.WriteLine(classInfo2.Subject.Name);

}

#endregion

在上面的代码中,已经创建好一个工具实例了,这时只需将这个工具作为参数放入BuildUp中,同时还需指定这个工具实例所实现的接口或父类类型,这样Unity就会自动帮我们将这个已存在工具实例中各类注入。

必要留意的是,与上面所说3种依附注入的不合的是,上面3中的依附注入必要在详细的类中应用InjectionConstructor、InjectionMethodDependency和特点,而假如对已经存在的工具进行依附注入,则必要将InjectionConstructor、InjectionMethod和Dependency写在这个工具实例所实现的接口或父类中,否则会报错!

到本文为止,Unity的各类常用功能都已经先容完毕了,各位可以下载下面的源代码进行查看,同时也可以经由过程Main措施中的各个措施来查看Unity的各类功能的应用:

示例代码下载:点我下载

(留意:本文示例代码是基于VS2010+Unity2.0,以是请应用VS2010打开,假如没有安装VS2010,请将相关代码复制到响应的VS中运行既可)

转自:http://www.cnblogs.com/kyo-yo/archive/2010/11/29/Learning-EntLib-Tenth-Decoupling-Your-System-Using-The-Unity-PART3-Dependency-Injection.html

您可能还会对下面的文章感兴趣: