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/