Unity Application Block Hands-on Lab for Enter-Lib 5.0:Lab 1-Using a Unity Container[Translation]
2012-02-15 20:04
447 查看
本实验时间估计:15mins
这里下载。
运行或者调试应用程序。运行结果,打开一个窗口和一个控制台。控制台显示的是应用程序运行时记录的信息。
在程序窗口中,你可以输入股票符号,只有字母组成,点击Subscribe按钮,同时选择Refresh,窗口会显示你加入股票的最新信息。窗口会定时更新。运行结果如下:
同时,在\bin\Debug目录下还有一个文件,记录着操作信息。
加入引用:Microsoft.Practices.Unity。
打开Program.cs文件。
增加usingMicrosoft.Practices.Unity的命名空间。
用UnityContainer中的Resolve替换直接使用构造函数创建StockTickerPresenter,如下:
Unity实现了IDisposable接口,可以使用using语句。
调试程序,程序会被一个ResolutionFailedException中止。这是由于StocksTickerPresenter的构造函数需要IStocksTickerView和IStockQuoteService,在调用该构造函数时,IStocksTickerView不能被实例化。
使用RegisterType方法加入需要的类型映射。代码如下:
再次调试程序
程序正常运行,但是缺少了Console的显示和ui.log文件的信息记录。
建立MoneyCentralStockService类的Logger属性的注入。
打开StockQuoteService\MoneyCentralStockQuoteService.cs文件[本人使用的是RandomStockQuoteService]
增加usingMicrosoft.Practices.Unity。
给Logger属性加入[Dependency]Attribute。
添加类型注册。
由于Container显示需要使用ILogger接口,需要添加类型映射。
打开Program.cs文件,更改代码为:
运行结果:窗口显示正常,控制台显示正常,但是ui.log没有记录信息,由于presenter类中的Logger类没有注入。
给StockTickerPresenter注入Logger属性
给StockTickerPresenter注入Logger属性,使用相同的Attribute[Dependency],但是Logger实例已经被注入过了,再注入一个Logger,需要标记为不同的Logger。
打开UI\StocksTickerPresenter.cs文件
增加usingMicrosoft.Practices.Unity。
给Logger属性加上Attribute[Dependency(“UI”)]
同样地,在Program中注册类型。
调试程序,报错!由于TraceSourceLogger类有多个构造函数,Unity不能区分,因此必须指明调用哪个构造函数。
使用InjectionConstructorAttribute指明构造函数
打开Logger\TraceSourceLogger文件
增加usingMicrosoft.Practices.Unity
给其中一个构造函数添加Attribute。
回到Program中,用RegisterInstance方法指明在Resolving中会使用到的TraceSource。
运行程序,OK,更刚开始一样了~
介绍
在这次实验中,你将练习使用Unity创建应用程序。主要内容是修改一个简单的证劵报价器应用程序,使该应用程序中的构造函数与属性通过Unity创建。证劵报价器
代码运行或者调试应用程序。运行结果,打开一个窗口和一个控制台。控制台显示的是应用程序运行时记录的信息。
在程序窗口中,你可以输入股票符号,只有字母组成,点击Subscribe按钮,同时选择Refresh,窗口会显示你加入股票的最新信息。窗口会定时更新。运行结果如下:
同时,在\bin\Debug目录下还有一个文件,记录着操作信息。
应用程序的UML
该程序使用Model-View-Presenter(MVP)模式创建。具体UML如下:任务1:使用Container
在该任务中,程序原始代码将会被更改为使用UnityContainer来创建和连接程序的实体类,代替直接调用类的构造函数和属性。加入引用:Microsoft.Practices.Unity。
打开Program.cs文件。
增加usingMicrosoft.Practices.Unity的命名空间。
用UnityContainer中的Resolve替换直接使用构造函数创建StockTickerPresenter,如下:
staticvoidMain()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
using(IUnityContainercontainer=newUnityContainer())
{
StocksTickerPresenterpresenter=container.Resolve<StocksTickerPresenter>();
Application.Run((Form)presenter.View);
}
}
Unity实现了IDisposable接口,可以使用using语句。
调试程序,程序会被一个ResolutionFailedException中止。这是由于StocksTickerPresenter的构造函数需要IStocksTickerView和IStockQuoteService,在调用该构造函数时,IStocksTickerView不能被实例化。
使用RegisterType方法加入需要的类型映射。代码如下:
using(IUnityContainercontainer=newUnityContainer())
{
container.RegisterType<IStocksTickerView,StocksTickerForm>()
.RegisterType<IStockQuoteService,RandomStockQuoteService>();
StocksTickerPresenterpresenter=container.Resolve<StocksTickerPresenter>();
Application.Run((Form)presenter.View);
}
再次调试程序
程序正常运行,但是缺少了Console的显示和ui.log文件的信息记录。
任务2:使用Attributes注入
Attributes可以更改注入方式。使用Attributes可以属性注入和方法注入。建立MoneyCentralStockService类的Logger属性的注入。
打开StockQuoteService\MoneyCentralStockQuoteService.cs文件[本人使用的是RandomStockQuoteService]
增加usingMicrosoft.Practices.Unity。
给Logger属性加入[Dependency]Attribute。
privateILoggerlogger;
[Dependency]
publicILoggerLogger
{
get{returnlogger;}
set{logger=value;}
}
添加类型注册。
由于Container显示需要使用ILogger接口,需要添加类型映射。
打开Program.cs文件,更改代码为:
using(IUnityContainercontainer=newUnityContainer())
{
container.RegisterType<IStocksTickerView,StocksTickerForm>()
.RegisterType<IStockQuoteService,RandomStockQuoteService>()
.RegisterType<ILogger,ConsoleLogger>()
StocksTickerPresenterpresenter=container.Resolve<StocksTickerPresenter>();
Application.Run((Form)presenter.View);
}
运行结果:窗口显示正常,控制台显示正常,但是ui.log没有记录信息,由于presenter类中的Logger类没有注入。
给StockTickerPresenter注入Logger属性
给StockTickerPresenter注入Logger属性,使用相同的Attribute[Dependency],但是Logger实例已经被注入过了,再注入一个Logger,需要标记为不同的Logger。
打开UI\StocksTickerPresenter.cs文件
增加usingMicrosoft.Practices.Unity。
给Logger属性加上Attribute[Dependency(“UI”)]
同样地,在Program中注册类型。
调试程序,报错!由于TraceSourceLogger类有多个构造函数,Unity不能区分,因此必须指明调用哪个构造函数。
使用InjectionConstructorAttribute指明构造函数
打开Logger\TraceSourceLogger文件
增加usingMicrosoft.Practices.Unity
给其中一个构造函数添加Attribute。
[InjectionConstructor]
publicTraceSourceLogger(TraceSourcetraceSource)
{
this.traceSource=traceSource;
}
回到Program中,用RegisterInstance方法指明在Resolving中会使用到的TraceSource。
using(IUnityContainercontainer=newUnityContainer())
{
container.RegisterType<IStocksTickerView,StocksTickerForm>()
.RegisterType<IStockQuoteService,RandomStockQuoteService>()
.RegisterType<ILogger,ConsoleLogger>()
.RegisterType<ILogger,TraceSourceLogger>("UI")
.RegisterInstance(newTraceSource("UI",SourceLevels.All));
StocksTickerPresenterpresenter=container.Resolve<StocksTickerPresenter>();
Application.Run((Form)presenter.View);
}
运行程序,OK,更刚开始一样了~
相关文章推荐
- Unity Application Block Hands-on Lab for Enter-Lib 5.0:Lab 4-Configuring Containers[Translation]
- Unity Application Block Hands-on Lab for Enter-Lib 5.0:Lab 3-Using a Configuration File[Translation]
- Unity Application Block Hands-on Lab for Enter-Lib 5.0:Lab 2-Using the Configuration API[Translation]
- Unity Application Block Hands-on Lab for Enter-Lib 5.0:Lab 4-Configuring Containers[Translation]
- Caching Application Block Hands-On Lab(缓存对象持久化)
- Sampled Softmax 论文笔记:On Using Very Large Target Vocabulary for Neural Machine Translation
- This file is based on the Microsoft Data Access Application Block for .NET
- [转]Composite UI Application Block - December 2005 Release for C# and Visual Basic .NET Now on MSDN!
- Sampled Softmax 论文笔记:On Using Very Large Target Vocabulary for Neural Machine Translation
- List Of Vulnerability Web Application on Hands for Practical Experiment
- Enterprise Library 5.0 Hands On Lab(1):数据访问程序块(一)
- On Using Very Large Target Vocabulary for Neural Machine Translation
- Research on GIS Using in Verification System for State-invested Geological Exploration
- Unity Application Block 发布
- Unity Application Block 发布
- Spring Security Filter Chain Registration Using WebApplicationInitializer for Servlet 3.x
- Unity Application Block 1.0系列(4): 方法调用注入(Method Call Injection )
- Warning: unknown mime-type for "xxx" -- using "application/octet-stream"
- Unity Application Block 学习笔记 之 命名实例、匿名实例和循环引用
- Enterprise Library 2.0 Hands On Lab 翻译(5):日志应用程序块(二)