Browse Source

部分解耦

master
DESKTOP-B25GA9E\W35 2 years ago
parent
commit
48b4771fd7
  1. 5
      Assets/Plugins/Android/BTPluginAndroid.aar.meta
  2. 288
      Assets/TCPClient/Script/Source/DataEventModel.cs
  3. 22
      Assets/TCPClient/Script/Source/TCPEventModel.cs
  4. 8
      Assets/TCPClient/Script/View/TCPClientView.cs

5
Assets/Plugins/Android/BTPluginAndroid.aar.meta

@ -1,14 +1,15 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: dbd87312a872da045b50fc427851aa45 guid: dbd87312a872da045b50fc427851aa45
timeCreated: 1569408333
licenseType: Store
PluginImporter: PluginImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
iconMap: {} iconMap: {}
executionOrder: {} executionOrder: {}
defineConstraints: []
isPreloaded: 0 isPreloaded: 0
isOverridable: 0 isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData: platformData:
- first: - first:
Android: Android Android: Android

288
Assets/TCPClient/Script/Source/DataEventModel.cs

@ -5,176 +5,190 @@ using QFramework;
using UnityEngine; using UnityEngine;
using UnityEngine.Events; using UnityEngine.Events;
namespace TCPClientTools {
//任何通讯类围绕DataEventModel进行 //任何通讯类围绕DataEventModel进行
public abstract class DataEventModel : AbstractModel, ICanSendCommand, ICanRegisterEvent public abstract class DataEventModel : AbstractModel, ICanSendCommand, ICanRegisterEvent
{ {
public IOCContainer mCommandContainer = new IOCContainer(); public IOCContainer mCommandContainer = new IOCContainer();
public UnityStringEvent onDataRecived = new UnityStringEvent(); public UnityStringEvent onDataRecived = new UnityStringEvent();
public void sendResponseCommand<T>(string json) where T : IResponse, new()
{ public void excuteResponseCommand<T>(string json) where T : IResponse, new()
if (mCommandContainer.Get<ExcuteResponseCommand<T>>() == null) {
{ if (mCommandContainer.Get<ExcuteResponseCommand<T>>() == null)
mCommandContainer.Register(new ExcuteResponseCommand<T>(new T()));
}
mCommandContainer.Get<ExcuteResponseCommand<T>>().setJson(json);
this.SendCommand(mCommandContainer.Get<ExcuteResponseCommand<T>>());
}
/// <summary>
/// 开启接收指定数据
/// </summary>
/// <typeparam name="T">数据格式类型</typeparam>
public void onReceive<T>() where T : IResponse, new()
{
onDataRecived.AddListener(sendResponseCommand<T>);
}
/// <summary>
/// 关闭接收指定数据
/// </summary>
/// <typeparam name="T">数据格式类型</typeparam>
public void offReceive<T>() where T : IResponse, new()
{
onDataRecived.RemoveListener(sendResponseCommand<T>);
}
/// <summary>
/// 发送数据
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="request">请求数据</param>
public void sendRequestCommand<T>(T request) where T : IRequest
{ {
if (mCommandContainer.Get<SendRequestCommand<T>>() == null) mCommandContainer.Register(new ExcuteResponseCommand<T>(new T()));
{
mCommandContainer.Register(new SendRequestCommand<T>(request));
}
mCommandContainer.Get<SendRequestCommand<T>>().setRequest(request);
this.SendCommand(mCommandContainer.Get<SendRequestCommand<T>>());
} }
mCommandContainer.Get<ExcuteResponseCommand<T>>().setJson(json);
this.SendCommand(mCommandContainer.Get<ExcuteResponseCommand<T>>());
} }
#region Command
/// <summary> /// <summary>
/// 处理响应数据,添加对应的Command进行处理,需要提前生成命令池 /// 开启接收指定数据
/// </summary> /// </summary>
/// <typeparam name="TResponse">响应数据格式</typeparam> /// <typeparam name="T">数据格式类型</typeparam>
public class ExcuteResponseCommand<TResponse> : AbstractCommand where TResponse : IResponse public void onReceive<T>() where T : IResponse, new()
{ {
public string json; onDataRecived.AddListener(excuteResponseCommand<T>);
private TResponse response; }
public ExcuteResponseCommand(TResponse response) /// <summary>
{ /// 关闭接收指定数据
if (this.response == null) /// </summary>
{ /// <typeparam name="T">数据格式类型</typeparam>
this.response = response; public void offReceive<T>() where T : IResponse, new()
} {
} onDataRecived.RemoveListener(excuteResponseCommand<T>);
protected override void OnExecute() }
{ /// <summary>
bool isSet = response.trySetData(json); /// 发送数据
if (isSet) /// </summary>
{ /// <typeparam name="T">数据类型</typeparam>
Debug.Log("Received:" + response.toJson() + response.GetType()); /// <param name="request">请求数据</param>
this.SendEvent(new ResponseMsgEvent(response)); public void sendRequestCommand<T>(T request) where T : IRequest
} {
} if (mCommandContainer.Get<SendRequestCommand<T>>() == null)
public void setJson(string json)
{ {
this.json = json; mCommandContainer.Register(new SendRequestCommand<T>(request));
} }
mCommandContainer.Get<SendRequestCommand<T>>().setRequest(request);
this.SendCommand(mCommandContainer.Get<SendRequestCommand<T>>());
} }
}
public class SendRequestCommand<TRequest> : AbstractCommand where TRequest : IRequest #region Command
/// <summary>
/// 处理响应数据,添加对应的Command进行处理,需要提前生成命令池
/// </summary>
/// <typeparam name="TResponse">响应数据格式</typeparam>
public class ExcuteResponseCommand<TResponse> : AbstractCommand where TResponse : IResponse
{
public string json;
private TResponse response;
public ExcuteResponseCommand(TResponse response)
{ {
public TRequest request; if (this.response == null)
public SendRequestCommand(TRequest request)
{ {
this.request = request; this.response = response;
} }
protected override void OnExecute() }
{ protected override void OnExecute()
if (this.GetUtility<TCPUtility>().isOpenTCP) {
{ bool isSet = response.trySetData(json);
this.GetUtility<TCPUtility>().sendData(request.toJson()); if (isSet)
}
else
{
Debug.LogWarning("请先开启TCP链接");
}
//throw new NotImplementedException();
}
public void setRequest(TRequest request)
{ {
this.request = request; Debug.Log("Received:" + response.toJson() + response.GetType());
this.SendEvent(new ResponseMsgEvent(response));
} }
} }
#endregion public void setJson(string json)
#region interface
public interface IResponse
{ {
string toJson(); this.json = json;
/// <summary>
/// 尝试填充数据,如果json不合法,则返回false,忽略该条数据响应
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
bool trySetData(string json);
string getException();
} }
}
public interface IRequest public class SendRequestCommand<TRequest> : AbstractCommand where TRequest : IRequest
{
public TRequest request;
public SendRequestCommand(TRequest request)
{ {
string toJson(); this.request = request;
} }
#endregion protected override void OnExecute()
{
this.SendEvent(new RequestMsgEvent(request));
}
public void setRequest(TRequest request)
{
this.request = request;
}
}
#endregion
#region AbstractClass #region interface
public interface IResponse
{
string toJson();
/// <summary> /// <summary>
/// 使用抽象类时,必须满足可序列化 /// 尝试填充数据,如果json不合法,则返回false,忽略该条数据响应
/// </summary> /// </summary>
[Serializable] /// <param name="json"></param>
public abstract class AbstractResponse : IResponse /// <returns></returns>
bool trySetData(string json);
string getException();
}
public interface IRequest
{
string toJson();
}
//用于标准化通讯方案(具体链接管理,由外部类决定,本接口只提供开启链接跟关闭链接)
public interface IProtocol {
void linkServer();
void closeServer();
}
#endregion
#region Extention
/*
public static class CanGetStateExtention {
public static void GetState<TLinkStatus>(this IProtocol self) {
}
}
*/
#endregion
#region AbstractClass
/// <summary>
/// 使用抽象类时,必须满足可序列化
/// </summary>
[Serializable]
public abstract class AbstractResponse : IResponse
{
private string exceptionMsg;
public virtual string toJson()
{ {
private string exceptionMsg; return JsonUtility.ToJson(this, true);
public virtual string toJson() }
{ public virtual bool trySetData(string json)
return JsonUtility.ToJson(this, true); {
} try
public virtual bool trySetData(string json)
{ {
try JsonUtility.FromJsonOverwrite(json, this);
{ return true;
JsonUtility.FromJsonOverwrite(json, this);
return true;
}
catch (Exception e)
{
exceptionMsg = e.ToString();
return false;
}
} }
public string getException() catch (Exception e)
{ {
return exceptionMsg; exceptionMsg = e.ToString();
return false;
} }
} }
#endregion public string getException()
#region event
public struct ResponseMsgEvent
{
public IResponse res;
public ResponseMsgEvent(IResponse res_)
{
res = res_;
}
};
#endregion
[Serializable]
public class UnityStringEvent : UnityEvent<string>
{ {
return exceptionMsg;
}
}
#endregion
#region event
public struct ResponseMsgEvent
{
public IResponse res;
public ResponseMsgEvent(IResponse res_)
{
res = res_;
}
};
public struct RequestMsgEvent {
public IRequest req;
public RequestMsgEvent(IRequest req_) {
req = req_;
} }
} }
#endregion
[Serializable]
public class UnityStringEvent : UnityEvent<string>
{
}

22
Assets/TCPClient/Script/Source/TCPEventModel.cs

@ -1,21 +1,10 @@
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.Events;
using QFramework; using QFramework;
using System;
namespace TCPClientTools namespace TCPClientTools
{ {
public class TCPMangerArchitecture : Architecture<TCPMangerArchitecture>
{
protected override void Init()
{
this.RegisterUtility(new TCPUtility());
this.RegisterModel(new TCPEventModel());
}
}
//统筹管理TCP的命令池以及相关链接信息 //统筹管理TCP的命令池以及相关链接信息
public class TCPEventModel : DataEventModel, ICanSendCommand,ICanRegisterEvent public class TCPEventModel : DataEventModel, ICanSendCommand,ICanRegisterEvent
{ {
@ -30,6 +19,17 @@ namespace TCPClientTools
setTCPState(TCPLinkState.LinkTimeOut); setTCPState(TCPLinkState.LinkTimeOut);
this.GetUtility<TCPUtility>().CloseTCPClient(); this.GetUtility<TCPUtility>().CloseTCPClient();
}); });
//注册重写发送事件
this.RegisterEvent<RequestMsgEvent>(e => {
if (this.GetUtility<TCPUtility>().isOpenTCP)
{
this.GetUtility<TCPUtility>().sendData(e.req.toJson());
}
else
{
Debug.LogWarning("请先开启TCP链接");
}
});
} }
public void setTCPState(TCPLinkState state) { public void setTCPState(TCPLinkState state) {
this.tcpState = state; this.tcpState = state;

8
Assets/TCPClient/Script/View/TCPClientView.cs

@ -6,6 +6,14 @@ using QFramework;
using TCPClientTools; using TCPClientTools;
using System; using System;
public class TCPMangerArchitecture : Architecture<TCPMangerArchitecture>
{
protected override void Init()
{
this.RegisterUtility(new TCPUtility());
this.RegisterModel(new TCPEventModel());
}
}
public class TCPClientView : MonoBehaviour,IController,ICanSendEvent public class TCPClientView : MonoBehaviour,IController,ICanSendEvent
{ {
public UnityEvent onRecievedOpenDevice; public UnityEvent onRecievedOpenDevice;

Loading…
Cancel
Save