Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路

那就是利用mvvmlight中的messager组件(可单独提取出),制作双向的一个消息发送。通过公共的类的定义,来传递数据。

首先有一个数据提供者的概念,他负责对外提供接口。

这个时候调用者如果想获取某个数据,就发送消息,数据提供者如果提供这个数据,就会响应。

比如:A:我发送一个应用的ID,我想获取应用的详细数据。B:我提供接收ID返回详情的服务,我发回给你。

核心组件:

1:MVVMLight中的Messager组件

2:DataProviderBase.cs 所有提供接口和数据的类必须继承的(以单例模式),每一个类的RegisterInit方法需要在程序启动时候初始化。

需要提供什么对外接口,就通过Register注册什么接口

同时通过MessagerHandler添加对该接口数据的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//By liubaicai.net
public abstract class DataProviderBase<T> where T : new()
{
    private static T _instance;
    public static T Instance
    {
        get
        {
            if (_instance == null)
                _instance = new T();
            return _instance;
        }
    }
 
    public abstract void RegisterInit();
 
    public abstract Task<IMessager> MessagerHandler(IMessager messager);
 
    public void Register<TRequest, TResponse>()
        where TRequest : IMessager
        where TResponse : IMessager
    {
        Action<TRequest> requestAction = async messager =>
        {
            var returnmessager = await MessagerHandler(messager);
            Messenger.Default.Send((TResponse)returnmessager);
        };
        Messenger.Default.Register(this, requestAction);
    }
}

3:IMessager.cs所有消息需要继承的接口

1
2
3
4
5
6
//By liubaicai.net
public interface IMessager
{
    int Code { set; get; }
 
    string Msg { set; get; }
}

4:MessagerCenter.cs提供发送数据的方法,由数据请求方使用

1
2
3
4
5
6
7
8
9
10
11
//By liubaicai.net
public class MessagerCenter
{
    public static void Send<TRequest, TResponse>(object recipient, IMessager requestMessager, Action<TResponse> action)
        where TRequest : IMessager
        where TResponse : IMessager
    {
        Messenger.Default.Unregister(recipient, action);
        Messenger.Default.Register(recipient, action);
        Messenger.Default.Send((TRequest)requestMessager);
    }
}

使用案例:我有一个数据提供者,传入应用详情ID,返回应用标题

1:首先定义一组Messager

1
2
3
4
5
6
7
8
9
10
11
12
13
//By liubaicai.net
public class AppDetailRequestMessager : IMessager
{
    public int Code { get; set; }
    public string Msg { get; set; }
    public string Appid { get; set; }
}
 //By liubaicai.net
public class AppDetailResponseMessager : IMessager
{
    public int Code { get; set; }
    public string Msg { get; set; }
    public string AppTitle { get; set; }
}

2:添加AppDataProvider继承DataProviderBase,并实现方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//By liubaicai.net
public sealed class AppDataProvider : DataProviderBase<appdataprovider>
{
    public override void RegisterInit()
    {
        Register<AppDetailRequestMessager, AppDetailResponseMessager>();
    }
 
    public async override Task<IMessager> MessagerHandler(IMessager messager)
    {
        if (messager is AppDetailRequestMessager)
        {
            var m = messager as AppDetailRequestMessager;
            var title = await getAppDetailTask(m.Appid);
            return new AppDetailResponseMessager() { Code = m.Code, Msg = m.Msg, AppTitle = title };
        }
        else
        {
            return null;
        }
    }
 
    private async Task<string> getAppDetailTask(string msg)
    {
        await Task.Delay(500);
        return "return:" + msg;
    }
}

3:在主程序启动或者初始化或者必要的时候执行注册

1
AppDataProvider.Instance.RegisterInit();

这样数据提供者就完成了

当如果有地方需要调用此接口,只需要调用发送方法并处理返回值就OK:

1
2
3
4
5
6
7
8
//By liubaicai.net
MessagerCenter.Send<AppDetailRequestMessager, AppDetailResponseMessager>(this,
    new AppDetailRequestMessager() { Code = 1, Msg = "Test", Appid = "12315" },
    messager =>
    {
        Debug.WriteLine("=======================");
        Debug.WriteLine(messager.AppTitle);
        Debug.WriteLine("=======================");
    });

这样就实现了不添加程序集引用就调用相关API的方法了。

有不合理的地方欢迎交♂流~(包子,Paradox 提供部分技术支持~)

更多内容分享访问:http://www.liubaicai.net/

Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路的更多相关文章

  1. 解决ArcGIS中因SDE或数据库配置问题而导致服务宕掉的一种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 最近连续有两个项目现场出现了AGS服务荡掉的问题,一个是通州 ...

  2. chrome浏览器中解决embed标签 loop="true" 背景音乐无法循环的问题。

    今天试了下在html网页中加入背景音乐并设置为循环播放.一开始用<embed>标签,设置loop="true", 但是结果发现在IE浏览器可以,但是在chrome浏览器 ...

  3. iOS中block的使用、实现底层、循环引用、存储位置

    一.整体介绍 定义:C语言的匿名函数,

  4. 解决Eclipse中Java工程间循环引用而报错的问题

    如果myeclipse  报如下错误 A cycle was detected in the build path of project 如果我们的项目包含多个工程(project),而它们之间又是循 ...

  5. 如何在 iOS 中解决循环引用的问题

    稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来. 但是遇到下面这样的情况,如果只看其实现代码,也很 ...

  6. 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(上)

    深入研究Block捕获外部变量和__block实现原理 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如R ...

  7. Spring里bean之间的循环依赖解决与源码解读

    通过前几节的分析,已经成功将bean实例化,但是大家一定要将bean的实例化和完成bean的创建区分开,bean的实例化仅仅是获得了bean的实例,该bean仍在继续创建之中,之后在该bean实例的基 ...

  8. Spring解决bean之间的循环依赖

    转自链接:https://blog.csdn.net/lyc_liyanchao/article/details/83099675通过前几节的分析,已经成功将bean实例化,但是大家一定要将bean的 ...

  9. ios 使用block中使用self可能产生的循环引用

    在block中调用 self,那么就会引起循环引用问题,那么这是为什么呢? 为什么self会对block进行强引用呢???? 这里推荐一篇关于block的专业文章,http://blog.csdn.n ...

随机推荐

  1. N皇后问题12 · N-Queens

    [抄题]: n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击. 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分 ...

  2. OC - runtime - 1

  3. (转载)Zab vs. Paxos

    原创链接:https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zab+vs.+Paxos Is Zab just a special imple ...

  4. part1:7-Linux网络配置

    1.虚拟机(Vmware)网络配置 VMware虚拟机对于不同的网络环境提供了三种网卡工作模式: Bridged:网桥模式: 在桥接模式下,计算机A充当路由器与虚拟机之间的“桥”,虚拟机通过计算机A的 ...

  5. gitlab VS github

    gitlab 和 github的比较 GitLab - 基于Git的项目管理软件 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务.

  6. 让IIS 7 如同IIS 8 第一次请求不变慢

    当我们把网站部署在IIS7或IIS6S的时候,每当IIS或是Application Pool重启后,第一次请求网站反应总是很慢,原因大家都知道(不知道可以参考这个动画说明ASP.NET网页第一个Req ...

  7. css心得体会

    非块级元素  要使得其有长宽的效果  可以设置  margin  和  padding 块级元素     可以直接设置  width  和  height div标签   要使得你内部元素居中   可 ...

  8. 使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器

    从kbmmw 4.4 开始,增加了认证管理器,这个比原来的简单认证提供了更多的功能.细化了很多权限操作. 今天对这一块做个介绍. 要做一个认证管理,大概分为以下5步: 1.  定义你要保护的资源,一般 ...

  9. [GO]解决golang.org/x/ 下包下载不下来的问题

    因为在项目中要使用到一个golang.org的包,但是因为墙的问题,官方方法已经无法使用,但是在github上存在一个镜像站可以使用,我们只需要将它克隆下来就可以正常使用了 mkdir -p $GOP ...

  10. spring boot web项目在IDEA下热部署解决办法(四步搞定)

    最近在用spring boot 做一个web站点,修改了类.html.js等,刷新页面,没有生效,非要手动去make一下或者重启,大大降低了开发效率. 什么是热部署? 应用启动后会把编译好的Class ...