一 概述

Socket服务只是提供一个网络传输服务。

业务逻辑层在整体架构中的位置在那里呢,如图:

网络层将解包后的消息包抛至业务逻辑层,业务逻辑层收到消息包后,解析消息类型,然后转入相应的处理流程处理

网络层应提供发送消息的接口供业务逻辑层调用,因为网络层不会主动发送消息,发送消息的操作是由业务逻辑层来控制的,所以业务逻辑层应根据具体的业务应用,封装不同功能的发送消息的方法。

二 设计

那我们有应该如果来设计业务逻辑层呢,尽量与Socket解耦合以达到相对的独立性。

根据上面的图来说是根据业务类型来处理不同的业务逻辑,并返回给客服端提示结果。

我们先来设计一个通用的业务接口,如下:

public interface ICommand<T>
{
      void Execute(T session, CommandInfo commandData);

}

代码解释:

session 对象主要包含如下功能:发送数据给客服端,会话验证,

commandData 对象主要包含业务Type处理业务。

函数体:主要就是根据commandData业务类型,转发到业务逻辑层处理业务并返回结果,有session发送给客服端。

流程:

1:Socket服务启动的时候把事先设定好的业务Type数据加载到内存。

2:Socket通过监听客服端连接,并接受数据的时候时,通过客服端传过来的业务Type来查找服务上的业务Type集合。

3:如果存在就转发到业务逻辑层处理业务并返回结果,有session发送给客服端。不存在直接返回并告知客服端服务器上没有此服务,请联系开发商。

性能瓶颈:

1:如果网络层和业务层在同一个线程中,那么网络层的处理必须等待数据库执行完毕后,才能进行!如果数据库执行效率比较慢,那对整个socket服务器将是一个毁灭性的打击。

三 具体实现

根据上面所说,网络层应该和业务逻辑层分开执行,并加入超时时间,时间一到不关结果如何,都将返回。

第一步:Socket服务启动的时候把事先设定好的业务Type数据加载到内存.

 public partial class HLEnvironment
{
private static Dictionary<string, ICommand<AsyncSocketSession>> dictCommand = new Dictionary<string, ICommand<AsyncSocketSession>>(StringComparer.OrdinalIgnoreCase);
public static void LoadCommands( )
{
Type commandType = typeof(ICommand<AsyncSocketSession>);
Assembly asm = typeof(AsyncSocketSession).Assembly;
Type[] arrType = asm.GetExportedTypes(); for (int i = 0; i < arrType.Length; i++)
{
var commandInterface = arrType[i].GetInterfaces().SingleOrDefault(x => x == commandType); if (commandInterface != null)
{
dictCommand[arrType[i].Name] = arrType[i].GetConstructor(new Type[0]).Invoke(new object[0]) as ICommand<AsyncSocketSession>;
}
}
Stup();
}
private static void Stup( )
{
Type commandType = typeof(ICommand<AsyncSocketSession>);
var files = EnumerateAllLibFiles();
foreach (var file in files)
{
Assembly ass = Assembly.LoadFrom(file);
Type[] arrType = ass.GetExportedTypes(); for (int i = 0; i < arrType.Length; i++)
{
var commandInterface = arrType[i].GetInterfaces().SingleOrDefault(x => x == commandType);
if (commandInterface != null)
{
dictCommand[arrType[i].Name] = arrType[i].GetConstructor(new Type[0]).Invoke(new object[0]) as ICommand<AsyncSocketSession>;
}
}
}
}
public static ICommand<AsyncSocketSession> GetCommandByName(string commandName)
{
ICommand<AsyncSocketSession> command; if (dictCommand.TryGetValue(commandName, out command))
return command;
else
return null;
}
public static IEnumerable<string> EnumerateAllLibFiles()
{
string libraryPath = MapDllPath("Servers\\");
Directory.CreateDirectory(libraryPath);
foreach (var dll in Directory.GetFiles(libraryPath, "*.dll"))
{
yield return dll;
}
}
}

第二步:Socket通过监听客服端连接,并接受数据的时候时,通过客服端传过来的业务Type来查找服务上的业务Type集合。

  protected override void ExecuteCommand(SocketSendData cmdInfo)
{
ICommand<AsyncSocketSession> command = HLEnvironment.GetCommandByName(cmdInfo.SocketCommandName);
if (command != null)
{
command.ExecuteCommand(this, cmdInfo);
}
}
3:如果存在就转发到业务逻辑层处理业务并返回结果,有session发送给客服端。不存在直接返回并告知客服端服务器上没有此服务,请联系开发商。
业务逻辑与Socket服务衔接的地方

四 开发人员

1:新建一个业务逻辑层,编写业务逻辑。

2:新建一个业务服务层,主要实现ICommand接口。

3:把开发好的Dll放到Servers文件夹下。

4:运行HLAsySocketServer启动服务。

HL AsySocket 服务开发框架 - 业务逻辑层的更多相关文章

  1. HL AsySocket 服务开发框架 - 总体思路与架构

    一 背景 最近在园子了浏览了几篇有关Socket文章,得到了一些启发萌生了想要重构公司在2000年用.NET Framework 2.0 与 Visual Studio 2005开发的AsySocke ...

  2. HL AsySocket 服务开发框架 - 一般性测试1

    一 概述 Socket服务器性能要好就要经过无数次的测试,来保证,以下是记录一次的测试经过. 机器配置:Inter(R) Core(TM) i3-2310m CPU 2.10GHz RAM 6.00G ...

  3. 9.1.3 .net framework通过业务逻辑层自动生成WebApi的做法

    首先需要说明的是这是.net framework的一个组件,而不是针对.net core的.目前工作比较忙,因此.net core的转换正在编写过程中,有了实现会第一时间贴出来. 接下来进入正题.对于 ...

  4. MyBatis知多少(6)表现层与业务逻辑层

    表现层 表现层负责向最终用户展示应用程序的控制方式以及数据.它还要负责所有信息的布局和格式.今天,商业应用程序最流行的表现方式应该算是Web前端了,它使用HTML和JavaScript并通 过Web浏 ...

  5. MVC5 网站开发之四 业务逻辑层的架构和基本功能

    业务逻辑层在Ninesky.Core中实现,主要功能封装一些方法通过调用数据存储层,向界面层提供服务.   目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 ...

  6. 在 ASP.NET 中创建数据访问和业务逻辑层(转)

    .NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...

  7. [Prodinner项目]学习分享_第三部分_Service层(业务逻辑层)

    前两节讲到怎样生成一个Model和怎样将Model映射到数据库,这一节将讲到业务逻辑层,也就是Service层. 1.Prodinner架构已经构建好的,基本的增删改查. 假设,我现在想操作第二节中讲 ...

  8. JSP业务逻辑层

    经典的三层架构:表示层.业务逻辑层和数据访问层 具体的区分方法 1:数据访问层:主要看你的数据层里面有没有包含逻辑处理,实际上他的各个函数主要完成各个对数据文件的操作.而不必管其他操作. 2:业务逻辑 ...

  9. MVC+Ef项目(4) 抽象业务逻辑层BLL层

    接下来,我们就要到业务逻辑层了,简单的说,业务逻辑层就是调用Repository(可以看做是DAL数据库访问层) 先来看看项目的架构 我们现在就开始来做BLL层.  同样,先编写  UserInfoS ...

随机推荐

  1. 「2013-9-5」Configure WingIDE for better display of East Asian Glyphs

    很久没写软件配置相关的博客了.这次对于 WingIDE 在 Windows 下的字体配置,折腾了好一阵子,略曲折,也反映了「不清楚原理和背景的情况下,盲人摸象的效率低下是必然」这条放之四海而皆准的赤果 ...

  2. 思维导图软件TheBrain 8全新发布 提供更强大的信息管理

    TheBrain思维导图软件是全球唯一一款动态的网状结构的思维导图软件,广泛用于学习.演讲.项目管理.会议.需求调研与分析等.其独特的信息组织方式使得用户可以创建并连接到数以万计的数字想法,为此在全球 ...

  3. Webpack使用教程二

    Webpack提供了很多的命令选项来帮助用户构建应用,如果只是通过命令行来使用这些选项,会显得不方便.为了更好的使用Webpack提供的各种命令选项,我们可以创建一个webpack.config.js ...

  4. SVEditor 1.3.6 发布

    SVEditor 1.3.6 支持代码高亮时没有处理 #ifdefs 语句的问题,支持类.接口.模块.任务和函数的代码折叠,修复了一些 bug. SVEditor 是一个Eclipse的插件,用来编辑 ...

  5. 【译】用Fragment创建动态的界面布局(附Android示例代码)

    原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...

  6. [ACM_几何] UVA 11300 Spreading the Wealth [分金币 左右给 最终相等 方程组 中位数]

    Problem A Communist regime is trying to redistribute wealth in a village. They have have decided to ...

  7. [ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)

    Description ycc 喜欢古典音乐是一个 ZJUTACM 集训队中大家都知道的事情.为了更方便地聆听音乐,最近 ycc 特意把他的家搬到了爱乐大街(德语Philharmoniker-Stra ...

  8. Qt之课外实践——文件操作(简单清道夫)

    说明:这个小项目是关于文件操作的.主要的功能有:重复文件的查找(根据文件的大小),说白了,就是讲大小相同的文件在一起显示出来,供用户自由的选择删除.这个360云盘里的文件去重还差的很远.还有空文件夹的 ...

  9. paip.提升性能---mysql 优化cpu多核以及lan性能的关系.

    paip.提升性能---mysql 优化cpu多核以及lan性能的关系. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:/ ...

  10. Jquery对Cookie的操作

    第一步:先引用jQuery的插件jquery-1.9.1.min.js 第二步:引用jquery.cookie.js插件 下对cookie的操作: $.cookie("cookieName& ...