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

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)