wpf使用spring.net,实现控制反转(IOC)
程序架构如上,总体是MVVM模式,view绑定viewModel,然后viewModel可再调用BLL的业务层。
如果viewmodel需要调用BLL,则需要引用BLL项目,这样就形成了强依赖关系。
使用spring.net即可解除这种依赖关系,实现控制反转。(应该也是使用了反射的原理),不过这时BLL项目需要修改生成路径,指定为View项目的生成路径,否则在调试运行时报异常。
接下来,开始在ViewModel,使用spring.net调用BLL层。
在ViewModel项目,右键,使用NuGet,获取spring.net,我们只需要安装spring.core即可(如果是asp.net的mvc项目,还需要安装spring.web...等)
安装好后,即可在引用列表里看到,附带还会引用到common.logging和common.logging.core这2个日志记录文件。
接下了,就是怎么在ViewModel里调用BLL的对象了。如何得到BLL里的某个类的对象呢?答案在spring.net的配置文件里。
spring.net读取他的关于实例化对象的配置信息
public static Spring.Context.Support.XmlApplicationContext BLLContext = new Spring.Context.Support.XmlApplicationContext("~/Config/BLL.xml");
其中“~/Config/BLL.xml”就是关于我要使用BLL项目的配置文件。
现在看下具体的BLL.xml配置文件里的内容
格式基本固定,1号代表这个对象的ID,代码里需要用到。2表示需要BLL项目里需要调用的类的完整的命名空间,这里我们是要用到“CP2012CardService”这里类。3表示BLL项目的程序集名称。singleton表示是否使用单例模式。
我是建立了个基类BaseViewModel,所有的ViewModel里的类都需要继承该类,
[Serializable] public class BaseViewModel : INotifyPropertyChanged { public static Spring.Context.Support.XmlApplicationContext BLLContext = new Spring.Context.Support.XmlApplicationContext("~/Config/BLL.xml"); public void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; }
这样在实例每个ViewModel里的类时,都能获得spring.net里关于BLL配置的信息。
然后就是在具体的每个类里调用BLL了。
其中“CP2012CardService”就是配置文件里的关于具体类的ID了。返回的就是BLL里具体类的实例对象。接下来就可以使用了。
配置文件的位置
注意xml需要作为内容输出
~结束
posted on 2016-10-27 16:52 Shine-Zhong 阅读(1304) 评论(0) 编辑 收藏 举报