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

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中解决多模块多程序集之间相互循环引用的问题一种思路的更多相关文章
- 解决ArcGIS中因SDE或数据库配置问题而导致服务宕掉的一种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 最近连续有两个项目现场出现了AGS服务荡掉的问题,一个是通州 ...
- chrome浏览器中解决embed标签 loop="true" 背景音乐无法循环的问题。
今天试了下在html网页中加入背景音乐并设置为循环播放.一开始用<embed>标签,设置loop="true", 但是结果发现在IE浏览器可以,但是在chrome浏览器 ...
- iOS中block的使用、实现底层、循环引用、存储位置
一.整体介绍 定义:C语言的匿名函数,
- 解决Eclipse中Java工程间循环引用而报错的问题
如果myeclipse 报如下错误 A cycle was detected in the build path of project 如果我们的项目包含多个工程(project),而它们之间又是循 ...
- 如何在 iOS 中解决循环引用的问题
稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来. 但是遇到下面这样的情况,如果只看其实现代码,也很 ...
- 深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用(上)
深入研究Block捕获外部变量和__block实现原理 前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如R ...
- Spring里bean之间的循环依赖解决与源码解读
通过前几节的分析,已经成功将bean实例化,但是大家一定要将bean的实例化和完成bean的创建区分开,bean的实例化仅仅是获得了bean的实例,该bean仍在继续创建之中,之后在该bean实例的基 ...
- Spring解决bean之间的循环依赖
转自链接:https://blog.csdn.net/lyc_liyanchao/article/details/83099675通过前几节的分析,已经成功将bean实例化,但是大家一定要将bean的 ...
- ios 使用block中使用self可能产生的循环引用
在block中调用 self,那么就会引起循环引用问题,那么这是为什么呢? 为什么self会对block进行强引用呢???? 这里推荐一篇关于block的专业文章,http://blog.csdn.n ...
随机推荐
- Binary Tree Traversal 二叉树的前中后序遍历
[抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...
- [leetcode]278. First Bad Version首个坏版本
You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...
- 向mysql数据库插入大量数据
1. package com.zy.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.P ...
- SQL 将一个字段内用逗号分隔的内容分成多条记录
转自:http://www.cnblogs.com/zfanlong1314/archive/2013/01/14/2859848.html --> 测试数据 if not object_id( ...
- linux下安装php php-fpm(转载)
centos安装php php-fpm 1.下载php源码包http://www.php.net/downloads.php2 .安装phptar -xvf php-5.5.13.tar.bz2cd ...
- 详解python2 和 python3的区别-乾颐堂
看到这个题目大家可能猜到了我接下来要讲些什么,呵呵,对了,那就是列出这两个不同版本间的却别!搜索一下大家就会知道,python有两个主要的版本,python2 和 python3 ,但是python又 ...
- asp.net请求编译流程图(其实就是说asp.netd代码是如何转成中间代码IL然后交给cpu执行的)
- DB2 like两个表的字段或like一个变量
DB2中的like的使用是有限制的,它后面不能跟一个变量或者是字段,因此,在存储过程或SQL语句中就不能like一个变量或一个字段. 比如有两个表A(a,b,c,d),B(a,b,c,d). 普遍的用 ...
- 如何设置vim中tab键缩进---配置初始化设置
转载自:http://blog.51cto.com/xuding/1725376:加了一些补充说明 问题: Linux系统下,Tab键默认为8个字符,需呀将其修改为4个字符的方式使用 步骤: 1.在用 ...
- 201709011工作日记--ART与Dalvik&&静态类与非静态类
1.ART 与 Dalvik 的优缺点对比 什么是Dalvik:Dalvik是Google公司自己设计用于Android平台的Java虚拟机.dex格式是专为Dalvik应用设计的一种压缩格.Dalv ...