Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

c# UnityContainer 依赖注入的分析

$
0
0

本文未经作者许可,不得转载引用,若需引用,请务必通过邮件方式联系作者,联系邮箱 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);


其中对象IoCContainer就是实例化后的UnityContainer ,这里用到了RegisterType, 有关这种函数的相关用法,请查询

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


作者:robinlovesnow 发表于2013-5-23 0:12:50 原文链接
阅读:75 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>