对象获取器IObjectRetriever -- ESBasic 可复用的.NET类库(17)

简介: 1.缘起: ESBasic中许多管理对象的容器都用到了这个ESBasic.ObjectManagement.IObjectRetriever接口,所以单独将其提出来介绍一下。 当我们向对象容器(Container)请求某个对象时,也许目标对象还未加载到容器中,这可能是因为容器在初始化的时候就没有加载这个对象,也有可能是因为这个对象是容器初始化以后新增到数据库(当然也有可能是其它的持久化存储)的。

1.缘起:

ESBasic中许多管理对象的容器都用到了这个ESBasic.ObjectManagement.IObjectRetriever接口,所以单独将其提出来介绍一下。

当我们向对象容器(Container)请求某个对象时,也许目标对象还未加载到容器中,这可能是因为容器在初始化的时候就没有加载这个对象,也有可能是因为这个对象是容器初始化以后新增到数据库(当然也有可能是其它的持久化存储)的。在这种情况下,对象容器就可以借助IObjectRetriever来将目标对象从数据库等持久化存储中加载到容器中来。

通过IObjectRetriever接口,我们就将对象的加载与对象的管理两种不同的职能区分开来了。对象的加载往往是与具体的应用密切相关的,而对象的管理功能却可以被大规模复用。不同的应用只要实现IObjectRetriever接口,然后将其注入到要复用的对象容器中,就可以使用ESBasic提供的那些有用的对象管理容器了。

  对象获取器与其它组件协作时的形象示意图如下:

 

2.适用场合:

在实现IObjectRetriever接口或使用与之相关的对象管理容器时,必须满足一个条件:每个对象都有唯一的一个ID

 

3.设计思想与实现

IObjectRetriever的接口定义如下: 

 

    public   interface   IObjectRetriever < Tkey ,TVal >  
    {
        
///   <summary>
        
///  Retrieve 根据ID获取目标对象。
        
///   </summary>
        TVal Retrieve(Tkey id);

        
///   <summary>
        
///  RetrieveAll 获取所有的对象。
        
///   </summary>       
         IDictionary < Tkey, TVal >  RetrieveAll();
    }

 

这个接口相当简单,其有两个泛型参数,TKey表示的是对象ID的类型,TVal就是对象自身的类型。而其中的两个方法,一个是根据ID从持久化存储中提取对象,一个则是提取所有的对象。

 

4. 使用时的注意事项

       在实现IObjectRetriever接口时,可以有些灵活性:

(1)我们不是只能从数据库获取对象,也可以从文件获取,甚至是可以从网络获取,或者从其它的服务器获取,等等。

(2)实现RetrieveAll方法时,不一定真的要获取所有的对象。通常,RetrieveAll方法在容器初始化时使用,这时根据你应用的需求,只需要加载初始化时够用的对象就好了,因为有些对象可能在系统运行的整个生命周期内都用不上,那就没有必要加载它。甚至,你可以返回一个不包含任何元素的字典--如果容器在初始化时,不需要加载任何对象的话。

   另外,还有一个你需要考虑的是对象的数量,如果对象的数量巨大,而且全部都需要在初始化时加载到容器中,则可能导致初始化要很长的时间,而且也要占用很大的内存。所以,只加载那些真正需要用到的对象,即可加快初始化速度,也可以节省内存。

 

5.扩展

    在设计和实现多叉树(ESBasic.ObjectManagement.Trees.Multiple.IMultiTree)时,我借助了IAgileNodePicker来提取多叉树中还未加载的节点。IAgileNodePicker继承自IObjectRetriever,并添加了一个获取多叉树根节点的PickupRoot方法。

    在介绍多叉树的章节,我们会再详细介绍IAgileNodePicker这个接口。

 

注: ESBasic已经开源,点击这里下载源码。
    
ESBasic开源前言

 

 

目录
相关文章
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
584 12
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
344 3
|
开发框架 .NET Linux
2款高效的.NET二维码生成类库
2款高效的.NET二维码生成类库
288 1
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
535 3
|
人工智能 前端开发 Devops
NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。
【7月更文挑战第4天】**.NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。实际应用涵盖企业系统、Web、移动和游戏开发,以及云服务。面对性能挑战、容器化、AI集成及跨平台竞争,.NET持续创新,开发者应关注技术趋势,提升技能,并参与社区,共同推进技术发展。**
247 1
|
XML 开发框架 数据格式
.Net Core 开发框架,支持多版本的类库
.Net Core 开发框架,支持多版本的类库
371 0
|
开发框架 .NET API
.NET Core 和 .NET 标准类库项目类型有什么区别?
在 Visual Studio 中,可创建三种类库:.NET Framework、.NET Standard 和 .NET Core。.NET Standard 是规范,确保跨.NET实现的API一致性,适用于代码共享。.NET Framework 用于特定技术,如旧版支持。.NET Core 库允许访问更多API但限制兼容性。选择取决于兼容性和所需API:需要广泛兼容性时用.NET Standard,需要更多API时用.NET Core。.NET Standard 替代了 PCL,促进多平台共享代码。
312 0
|
XML 数据格式 API
1分钟生成Net对象的注释
我们在开发过程中,肯定会有几个项目作为基础项目,存放一些比较常用的类和方法,供其他项目使用.一般来说,方法实现以后,就不想再去管它了,以致于新加入的某个伙计问这个项目里的方法有没注释或说明啊,一般的答案都是木有.
966 0
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
541 5
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
326 7