Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215

Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215
框架改进建议 – 扎老铁
Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215

Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215
Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215
class="post-53270 post type-post status-publish format-standard hentry">

框架改进建议

 

简化异步线程中的 Repository Sesison 开启操作,参考 Angular 4 Zone 的方案,传入本线程需要操作的实体,或自动侦测 。

 System.Threading.ThreadPool.QueueUserWorkItem((q) => {
               using (((NHibernateRepository<User>) RepositoryManager.Default.Of<User>()).BeginSessionLifecycle())
               {
                   XxxxReository.Instance.Get(123);
               }
});

 

一直以来的实现,Repository 获取 Session,通过当前线程 Context 获取的。

 

Service 是延迟初始化的,即懒加载,按需初始化,有些重量级的 Service 需要等到用户第一次调用时,才会初始化,导致第一次调用比较慢。

可以考虑增加一个特效,标记需要尽快初始化的 Service,系统启动完成后,后台异步自动开始初始化指定的 Service。

其它 Service 仍然是按需,节省点内存,不过有这个必要吗?

public static void On(End<InitComponent<ServiceManager>> @event)
       {
           System.Threading.ThreadPool.QueueUserWorkItem((q) =>
           {
               using (((NHibernateRepository<User>) RepositoryManager.Default.Of<User>()).BeginSessionLifecycle())
               {
                   PostService.Instance.ToString();
               }
           });
       }

 

 

待续

 

 

还有个重量级升级,一直没还动的

把 Service 弱化,甚至去掉,用纯事件驱动,其实目前已经是这样了,只是事件需要从 Controller 手动调用传入 Service。

其实可以简化,去掉这个调用,甚至 Controller 也不需要写了,定义好一个事件和对应的处理程序,自动提供 Web API 调用(可以认为是自动实现了 Controller 的 Action ),也可代码调用,也可单元测试。

写一个功能,变成了,

1.定义一个 Event 事件对象

2.如果数据结构比较复杂,再写一个处理数据转换的函数。(视情况,非必需,过半情况无需,或仅需仅需配置化处理,因为框架会提供一套数据转换的机制和自定义高级撞到呃 API)

3.写事件处理函数

那么权限也就很好对应了,如果需要很精细的权限控制,一个事件可对应一个权限,如果不需要,归类到某个实体的CRUD操作权限里面

升级后,原来的代码可以不改,仍旧兼容。如果是按照之前规定的标准的写法写的,改成新的写法,也很快,复制黏贴操作。

 

后台界面的 Angular 化。

 

 

启动速度优化

内存映射文件

每次重新启动进程,内存将被清除,一切都必须重新加载。为了解决这个问题,我们最近添加了内存映射文件来支持我们的解决方案,即NFX堆。 使用内存映射文件,可以在重新启动后从磁盘快速获取数据。

 

Big Memory 映射文件

内存中的处理过程是快速和容易实现的,但是当进程重新启动时,数据集会丢失,这个数据集通常(几十到几百GB)是很大的。从原始数据源拉出所有数据可能是非常耗时的,那是在重新启动后无法承受的时间开销。

为了解决这个问题,我们添加了内存映射文件(MMF)来支持使用标准的.NET类:MemoryMappedFileMemoryMappedViewAccessor。现在,我们使用MemoryMappedViewAccessor实例和一些低级技巧来直接使用指针访问数据,而不是使用字节数组作为内存段的后备存储,所有这些操作都使用标准的C#来完成,不需要C ++参与,以保持一切简单,特别是构建链。

通过MemoryMappedViewAccessor(MMFMemory类)写入内存直接修改OS层中的虚拟内存页面。如果操作系统不能将这些页面交换到磁盘中,便会尝试将这些页面放在物理RAM中。将Pile写入MMF的一个很好的功能是,进程在关闭后马上重启则不需要从磁盘重新读取所有内容。即使在进程终止之后,操作系统仍将映射到进程地址空间的页面保留。启动时,MMFPile可以以比从磁盘重新读取更快的方式访问RAM中的页面。

请注意,由于在MMFMemory类中完成了非托管代码的上下文切换,MMFPile的性能会比DefaultPile慢(基于字节数组)。

http://www.infoq.com/cn/articles/Big-Memory-Part-3?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text

.NET Native

 

如你有改进建议,请回复补充。

 

发表评论

电子邮件地址不会被公开。