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 ...
随机推荐
- python之ftp作业【还未完成】
作业要求 0.实现用户登陆 1.实现上传和下载 3.每个用户都有自己的家目录,且只可以访问自己的家目录 4.对用户进行磁盘配额,每个用户的空间不同,超过配额不允许下载和上传 5.允许用户在指定的家目录 ...
- php iframe 上传文件
我们通过动态的创建iframe,修改form的target,来实现无跳转的文件上传. 具体的实现步骤 1.捕捉表单提交事件 2.创建一个iframe 3.修改表单的target,指向iframe ...
- Luogu 2912 [USACO08OCT]牧场散步Pasture Walking
快乐树剖 #include<cstdio> #include<cstring> #include<algorithm> #define rd read() #def ...
- BZOJ2424 [HAOI2010]订货 - 费用流
题解 (非常裸的费用流 题意有一点表明不清: 该月卖出的商品可以不用算进仓库里面. 然后套上费用流模板 代码 #include<cstring> #include<queue> ...
- Ubuntu下的网络服务
一.Telnet Telnet是teletype network的缩写,表示远程登录协议和方式,分为Telnet客户端和Telnet服务器程序. Telnet服务虽然也属于客户机/服务器模型的服务,但 ...
- g++报错原因分析:expected class-name before ‘{’ token
今天写程序的时候, 遇到这样一个错误expected class-name before ‘{’ token 最后发现原来是我的头文件声明没有加. 继承时不要忘记加基类的头文件 错误: class F ...
- wcf服务契约代理链
意图:为了是客户端代理呈现出面向对象的多态的特征 a. 服务端 .契约 实现了契约的继承这个在服务端是一点问题没有,因为oprationcontract可以继承,虽然DataContract不能实现继 ...
- gj9 迭代器和生成器
9.1 python的迭代协议 list内部实现了__iter__()协议(魔法函数),是可迭代对象,但还不是迭代器(迭代器需要实现__next__协议) 生成器实现了__iter__(),__nex ...
- hibernate createQuery和createSQLQuery 查询结果count计算
createQuery 针对hql语句查询 Query query=getSession().createQuery(hql);int result =((Number) query.iterate( ...
- UVa 11167 Monkeys in the Emei Mountain (最大流)
题意:雪雪是一只猴子.它在每天的 2:00 —— 9:00之间非常渴,所以在这个期间它必须喝掉2个单位的水.它可以多次喝水,只要它喝水的总量是2.它从不多喝,在一小时内他只能喝一个单位的水.所以它喝水 ...