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编辑  收藏  举报

导航