Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路

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

 2014/11/14 16:03:07  刘白菜  程序员俱乐部  我要评论(0)
  • 摘要:WindowsPhone中解决多模块多程序集之间相互循环引用的问题一种思路那就是利用mvvmlight中的messager组件(可单独提取出),制作双向的一个消息发送。通过公共的类的定义,来传递数据。首先有一个数据提供者的概念,他负责对外提供接口。这个时候调用者如果想获取某个数据,就发送消息,数据提供者如果提供这个数据,就会响应。比如:A:我发送一个应用的ID,我想获取应用的详细数据。B:我提供接收ID返回详情的服务,我发回给你。核心组件:1:MVVMLight中的Messager组件2
  • 标签:程序 Windows 解决 问题 思路 循环

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 class="csharp keyword">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/

发表评论
用户名: 匿名