本文未经作者许可,不得转载引用,若需引用,请务必通过邮件方式联系作者,联系邮箱 xuanzhaopeng#gmail.com
在进行windows桌面应用程序或windows phone app开发的过程中,我们将会使用WPF.NET ,而他的亮点在于将界面的设计和软件的逻辑完全的分开,所有的数据进行绑定,所有的命令也同样绑定,这里不再冗余描述如何绑定变量和命令,而着重讲在绑定数据后,后端逻辑中的数据也通过依赖注入的方式进行设计,这么做的原因在于,我们的app使用的数据可能来自于webservice,譬如手机应用,我们不可能在手机中存储庞大的数据库,而是通过webservice来获取和更新数据,因此,如果我们仍然主动监控数据,这就意味着数据的更新是被动的,必须让用户触发,触发后将获得的数据设置到页面绑定的变量上,而如果是一个实时系统,你怎么做呢? 只能利用依赖注入,并且依赖注入能让你的系统更加模块化。 因此我举一个例子给大家看。
我们现在有一个ViewModel要初始化
[AppViewModel] class ClockViewModel { public ClockViewModel(IServices Services) { } }
这个viewmodel存放在一个dll中,我们现在要动态加载这个类,当然此时必须用Assembly和Attribute
private Type GetClassByAttribute(Type attributeType) { Assembly assembly = this.GetType().Assembly; var types = assembly.GetTypes().Where(t => Attribute.IsDefined(t, attributeType)).ToList(); return types.First(); }
通过GetClassByAttribute函数,传入参数为AppViewModel的类型, 我们就可以得到ClockViewModel的Type
现在我们要在依赖注入中注册这个Type
Type ViewModelType = this.GetClassByAttribute(typeof(AppViewModelAttribute)); this.IoCContainer.RegisterType(ViewModelType);
http://msdn.microsoft.com/en-us/library/cc440951.aspx
此时,我们通过Assembly只得到了ViewModel的类型,而不是实例化的对象,现在的目标是要初始化这个实例对象
因此我们要利用以下方式得到实例化对象
this.ViewModel = this.IoCContainer.Resolve(ViewModelType);
大功告成,我们通过Resolve方法,传入类型,就可以得到这个对象了,此时回顾前面的所有步骤,基本不存在在一层套一层实例化的冗余!
但是!!! 还没有结束,可能有些朋友会问,在ViewModel的构造函数中,其中必须传入一个参数类型为IService接口的对象,但我们根本没处理过这个对象,所以在我们执行上一行代码之前,必须先初始化这些接口对象!!
this.IoCContainer.RegisterType<IDataStreamingChannelFactory, DataStreamingChannelFactory>(); this.IoCContainer.RegisterType<IStreamingDataProvider, StreamingDataProvider>(); this.IoCContainer.RegisterType<IServices, ServiceRoot>();
我们这里看一下 ServiceRoot 的构造函数,
internal class ServiceRoot : IServices, IDataServices, IInfraServices { public ServiceRoot(IIoCContainer ioc, IDataStreamingChannelFactory channelFactory, IStreamingDataProvider streamingProvider) { } }
他的构造函数中,用到了IDataStreamingChannelFactory和IStreamingDataProvider,所以我们在注册IService之前,就应该把这两个也注册了
到此时,所有的步骤结束,完成了一个0耦合的对象实例化的过程。
寻求一份 c# 或java高级架构师的工作,或软件网站自动化测试及测试工具管理CI AGILE的高级管理工作
工作地点 北京
联系方式 xuanzhaopeng#gmail.com