zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    laravel5.5
    yii2.0 Activeform表单部分组件使用方法
    putty连接远程局域网的MySql(不需要单独打开plink)
    关于 CentOS 自启动(服务、脚本)
    make -j 多核并行编译 导致笔记本过热 自动关机保护
    CentOS 7 引导 -- GRUB2
    Centos 7 拨号上网(PPPOE)
    Centos 7 意外断电如何处理
    Windows/Linux 生成iOS证书及p12文件
    git add -f
  • 原文地址:https://www.cnblogs.com/liubaicai/p/4097254.html
Copyright © 2011-2022 走看看