在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型。还有一种情况,由于业务数
在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适应性和强壮型。还有一种情况,由于业务数据库的不断膨胀或者方便数据库的切割隔离,有时候也会把不同的业务数据库进行分拆,如权限提供数据库,客户关系管理数据库,工作流程数据库,企业营运数据库等等,因此在一个系统里面,同时使用2个或者以上的数据库的情况也是有的。针对这两种情况,本文介绍在我的Winform开发框架(也使用我的其他框架),如何具体处理这两个问题的。
在我的各种开发框架里面,底层都是采用同一种数据库的访问方式,就是采用了Enterprise Library的数据库访问模块,这个是微软开源的企业应用模块,里面各种应用模块,都堪称是开发的最佳实践。当然利用里面的数据库访问模块,是很广泛的,这个数据库访问模块,可以通过配置的方式支持多种数据库的变化。因此整合到我的Winform开发框架里面,也很容易实现这种多数据库的方式处理。
Winform开发框架,常见的分层模式,可以分为UI层、BLL层、DAL层、IDAL层、Entity层、公用类库层等等,B/S的Web开发框架也是提供类似的架构模式,它们只是Web界面层有所不同,这样就给我们提供了一个统一性的开发模式,使得开发起来更加高效,统一性更好。框架界面层以下的架构设计图如下所示。
1、支持多数据库的设置
1)数据库访问基类的了解
为了介绍支持多种数据库的模式,我们需要先来了解下整个框架的层次结构。喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CkFic3RyYWN0QmFzZURBTMrHs+nP88HLy/nT0Mr9vt2/4sq1z9a1xLOsvLa7+cDgoaM8L3A+CjxwPgpCYXNlREFMU1FMysfV67bUU3FsU2VydmVyyv2+3b/isr+31rX31fu7+cDgo6i63NChtcS199X7o6mhozwvcD4KPHA+CkJhc2VEQUxTUUxpdGXKx9XrttRTcWxpdGXK/b7dv+K1xLK/t9a199X7u/nA4KOoutzQobXEtffV+6OpoaM8L3A+CjxwPgpCYXNlREFMTXlTcWzKx9XrttRNeVNxbGl0Zcr9vt2/4rXEsr+31rX31fu7+cDgo6i63NChtcS199X7o6mhozwvcD4KPHA+CkJhc2VEQUxBY2Nlc3PKx9XrttRBY2Nlc3PK/b7dv+K1xLK/t9a199X7u/nA4KOoutzQobXEtffV+6OpoaM8L3A+CjxwPgpJQmFzZURBTMrHy/nT0Lv5tKHK/b7dv+K3w87KwOC1xL3Tv9qhozwvcD4KPHA+Csr9vt23w87KvdO/2sq1z9ay46OoyOdDdXN0b21lcqOpus2907/atqjS5bLjo6hJQ3VzdG9tZXKjqdK70fmjrLa809DSu7j2u/nA4KOsyOe7+dPaU3FsU2VydmVyyrXP1rXEu/nA4M6qQmFzZURBTFNRTKOs1eK49rv509pTcWxTZXJ2ZXK1xMr9vt23w87Ku/nA4KOsy/zSssrHvMyz0NfU0ru49rOsvLa7+cDgo6i087bgyv21xMq1z9bU2tXiwO+jqUFic3RyYWN0QmFzZURBTKGjy/vDx9auvOS1xLzMs9C52M+1yOfPwsv5yr48L3A+CjxwPgo8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140613/2014061309052829.png" alt="\">
而我们刚才在项目工程的图里面看到,BaseDALSQL、IBaseDAL、AbstractBaseDAL这些类库由于具有很大的通用性,为了减少在不同的项目中进行复制导致维护问题,因此我们全部把这些经常使用到的基类或者接口,抽取到一个独立的类库里面,为了和普通的DotNET公用类库命名进行区分(WHC.Framework.Commons),我们把它命名为WHC.Framework.ControlUtil。
2)多数据库的代码实馅喎?http://www.2cto.com/kf/yidong/wp/" target="_blank" class="keylink">WPC9wPgo8cD4KzqrBy8q1z9a24Mr9vt2/4rXE1qez1qOsztLDx9Do0qrU2sXk1sPOxLz+wO/D5rbByKHP4LnYtcTF5NbDo6y/tL7fzOXKx7m51OzEx9bWuMPK/b7dv+K1xKOsyLu687340NCz9cq8u6+yu82stcSzzNDyvK/A4KOstNO2+Mq1z9a199PDsrvNrMr9vt2/4sDg0M21xMr9vt2/4rfDzsrA4KGjPC9wPgo8cD4K1NpCYXNlQkxMtcRJbml0uq/K/cDvw+a1xMq1z9a0+sLryOfPwsv5yr6hozwvcD4KPHA+CiNyZWdpb24guPm+3bK7zay1xMr9vt2/4sDg0M2jrLm51OzP4NOmtcREQUyy4zwvcD4KPHA+CkFwcENvbmZpZyBjb25maWcgPSBuZXcgQXBwQ29uZmlnKCk7PC9wPgo8cD4Kc3RyaW5nIGRiVHlwZSA9IGNvbmZpZy5BcHBDb25maWdHZXQoJnF1b3Q7Q29tcG9uZW50RGJUeXBlJnF1b3Q7KTs8L3A+CjxwPgppZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZGJUeXBlKSk8L3A+CjxwPgp7PC9wPgo8cD4KZGJUeXBlID0gJnF1b3Q7c3Fsc2VydmVyJnF1b3Q7OzwvcD4KPHA+Cn08L3A+CjxwPgpkYlR5cGUgPSBkYlR5cGUuVG9Mb3dlcigpOzwvcD4KPHA+CnN0cmluZyBEQUxQcmVmaXggPSAmcXVvdDsmcXVvdDs7PC9wPgo8cD4KaWYgKGRiVHlwZSA9PSAmcXVvdDtzcWxzZXJ2ZXImcXVvdDspPC9wPgo8cD4KezwvcD4KPHA+CkRBTFByZWZpeCA9ICZxdW90O0RBTFNRTC4mcXVvdDs7PC9wPgo8cD4KfTwvcD4KPHA+CmVsc2VpZiAoZGJUeXBlID09ICZxdW90O2FjY2VzcyZxdW90Oyk8L3A+CjxwPgp7PC9wPgo8cD4KREFMUHJlZml4ID0gJnF1b3Q7REFMQWNjZXNzLiZxdW90Ozs8L3A+CjxwPgp9PC9wPgo8cD4KZWxzZWlmIChkYlR5cGUgPT0gJnF1b3Q7b3JhY2xlJnF1b3Q7KTwvcD4KPHA+Cns8L3A+CjxwPgpEQUxQcmVmaXggPSAmcXVvdDtEQUxPcmFjbGUuJnF1b3Q7OzwvcD4KPHA+Cn08L3A+CjxwPgplbHNlaWYgKGRiVHlwZSA9PSAmcXVvdDtzcWxpdGUmcXVvdDspPC9wPgo8cD4KezwvcD4KPHA+CkRBTFByZWZpeCA9ICZxdW90O0RBTFNRTGl0ZS4mcXVvdDs7PC9wPgo8cD4KfTwvcD4KPHA+CmVsc2VpZiAoZGJUeXBlID09ICZxdW90O215c3FsJnF1b3Q7KTwvcD4KPHA+Cns8L3A+CjxwPgpEQUxQcmVmaXggPSAmcXVvdDtEQUxNeVNxbC4mcXVvdDs7PC9wPgo8cD4KfTwvcD4KPHA+CiNlbmRyZWdpb248L3A+CjxwPgp0aGlzLmRhbE5hbWUgPSBibGxGdWxsTmFtZS5SZXBsYWNlKGJsbFByZWZpeCwgREFMUHJlZml4KTsvL8zmu7vW0Ly2tcRCTEwuzqpEQUwuo6y+zcrHREFMwOC1xMirw/s8L3A+CjxwPgpiYXNlRGFsID0gUmVmbGVjdC5DcmVhdGUodGhpcy5kYWxOYW1lLCBkYWxBc3NlbWJseU5hbWUpOy8vubnU7LbU06a1xERBTMr9vt23w87KsuO1xLbUz/PA4DwvcD4KPHA+CtTavt/M5bXE0rXO8bbUz/O1xLX308O1xMqxuvKjrM7Sw8eyu9aqtcDL/L7fzOXKx7X308PExLj2yv2+3b/itcS0psDtwOC9+NDQtKbA7bXEo6zWu9Do0qq199PDy/y1xLv5tKG907/avs2/ydLUwcujrMjnz8LKx73nw+ay47XEsr+31rX308O0+sLroaM8L3A+CjxwPgovL8m+s/252MGqtcS4vbz+PC9wPgo8cD4KaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShpZHMpKTwvcD4KPHA+Cns8L3A+CjxwPgpzdHJpbmdbXSBpZEFycmF5ID0gaWRzLlNwbGl0KA==",');
foreach (string id in idArray)
{
InformationInfo info = BLLFactory.FindByID(id);
if (info != null&& !string.IsNullOrEmpty(info.Attachment_GUID))
{
BLLFactory.Instance.DeleteByAttachGUID(info.Attachment_GUID);
}
}
}
在具体的配置文件里面,我们就可以根据需要配置好相关的数据库了。
根据Enterprise Library的配置,我们只要制定了,那么就会获取sqlServer的节点,而代码通过解析ComponentDbType配置项,就可以构造对应的数据库访问对象了。两者合一就可以正确获取到处理对象,并成功处理数据库的访问。
2、支持分拆不同数据库的设置
上面介绍的方式,一次性只能访问一个数据库,因此默认在代码构造数据库访问对象的时候,是通过下面的代码进行的。
Database db = DatabaseFactory.CreateDatabase();
这样每次只会获取defaultDatabase设置的数据库进行构造,如果我们在一个系统里面,同时支持多个数据库的访问,那么我们应该如何处理呢。
在框架的基类AbstractBaseDAL里面,我们对构造数据库的代码进行了封装。
///
/// 根据配置数据库配置名称生成Database对象
///
///
protectedvirtual Database CreateDatabase()
{
Database db = null;
if (string.IsNullOrEmpty(dbConfigName))
{
db = DatabaseFactory.CreateDatabase();
}
else
{
db = DatabaseFactory.CreateDatabase(dbConfigName);
}
return db;
}
而每个DAL层都会继承自AbstractBaseDAL,这样也就可以通过在DAL层指定dbConfigName进行使用不同的数据库的了。
但是这样问题出现了,假如我们有5个不同类型(SqlServer、Oracle、Mysql、Access、Sqlite)的数据库的DAL层,那么每个DAL层的实现类都要写一些代码,这样挺不方便,那么是否可以把它抽象到BLL层,这样只写一次配置就可以了,这个思路很好,我们具体来看看如何实现。
1)在IBaseDAL层定义接口
///
/// 数据访问层的接口
///
publicinterface IBaseDAL where T : BaseEntity
{
///
/// 设置数据库配置项名称
///
///
数据库配置项名称
void SetDbConfigName(string dbConfigName);
.............
}
2、在AbstractBaseDAL添加默认实现代码
///
/// 数据访问层的超级基类,所有数据库的数据访问基类都继承自这个超级基类,包括Oracle、SqlServer、Sqlite、MySql、Access等
///
publicabstractclass AbstractBaseDAL where T : BaseEntity, new()
{
///
/// 设置数据库配置项名称
///
///
数据库配置项名称
publicvirtualvoid SetDbConfigName(string dbConfigName)
{
this.dbConfigName = dbConfigName;
}
....................
}
3、在BaseBLL里面的Init函数进行调用设置处理
///
/// 参数赋值后,初始化相关对象
///
///
BLL业务类的全名(子类必须实现),子类构造函数传入this.GetType().FullName
///
数据访问层程序集的清单文件的文件名,不包括其扩展名。设置为NULL或默认为Assembly.GetExecutingAssembly().GetName().Name
///
BLL命名空间的前缀(BLL.)
///
数据库配置项名称
protectedvoid Init(string bllFullName, string dalAssemblyName = null, string bllPrefix = "BLL.")
{
.............
baseDal.SetDbConfigName(dbConfigName); //设置数据库配置项名称
}
4、在具体BLL层的业务类进行初始化处理。
///
/// 政策法规公告动态
///
publicclass Information : BaseBLL
{
public Information() : base()
{
base.Init(this.GetType().FullName, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name, "BLL.", "annotherConfig" );
}
这样设置后,我们具体调用的代码不变,但是指定业务的数据库访问已经使用了特定的配置项名称了,如果配置项不存在,那么还是会获取默认的配置项进行处理了。
通过这样的实现步骤,我们就能实现在一个业务系统里面,分拆不同的数据库,进行统一管理,而且又不会增加额外的调用难度,对于我们很多业务表,这种框架的处理方式 ,应该是不错的。

译者 | 李睿审校 | 孙淑娟随着Python越来越受欢迎,其局限性也越来越明显。一方面,编写Python应用程序并将其分发给没有安装Python的人员可能非常困难。解决这一问题的最常见方法是将程序与其所有支持库和文件以及Python运行时打包在一起。有一些工具可以做到这一点,例如PyInstaller,但它们需要大量的缓存才能正常工作。更重要的是,通常可以从生成的包中提取Python程序的源代码。在某些情况下,这会破坏交易。第三方项目Nuitka提供了一个激进的解决方案。它将Python程序编

ChatGPT 目前彻底改变了开发代码的方式,然而,大多数软件开发人员和数据专家仍然没有使用 ChatGPT 来改进和简化他们的工作。这就是为什么我在这里概述 5 个不同的功能,以提高我们的日常工作速度和质量。我们可以在日常工作中使用它们。现在,我们一起来了解一下吧。注意:切勿在 ChatGPT 中使用关键代码或信息。01.生成项目代码的框架从头开始构建新项目时,ChatGPT 是我的秘密武器。只需几个提示,它就可以生成我需要的代码框架,包括我选择的技术、框架和版本。它不仅为我节省了至少一个小时

今天这篇文章的重点是使用 ChatGPT API 创建私人语音 Chatbot Web 应用程序。目的是探索和发现人工智能的更多潜在用例和商业机会。我将逐步指导您完成开发过程,以确保您理解并可以复制自己的过程。为什么需要不是每个人都欢迎基于打字的服务,想象一下仍在学习写作技巧的孩子或无法在屏幕上正确看到单词的老年人。基于语音的 AI Chatbot 是解决这个问题的方法,就像它如何帮助我的孩子要求他的语音 Chatbot 给他读睡前故事一样。鉴于现有可用的助手选项,例如,苹果的 Siri 和亚马

测试时自适应(Test-TimeAdaptation,TTA)方法在测试阶段指导模型进行快速无监督/自监督学习,是当前用于提升深度模型分布外泛化能力的一种强有效工具。然而在动态开放场景中,稳定性不足仍是现有TTA方法的一大短板,严重阻碍了其实际部署。为此,来自华南理工大学、腾讯AILab及新加坡国立大学的研究团队,从统一的角度对现有TTA方法在动态场景下不稳定原因进行分析,指出依赖于Batch的归一化层是导致不稳定的关键原因之一,另外测试数据流中某些具有噪声/大规模梯度的样本

哈喽,大家好。之前给大家分享过摔倒识别、打架识别,今天以摔倒识别为例,我们看看能不能完全交给ChatGPT来做。让ChatGPT来做这件事,最核心的是如何向ChatGPT提问,把问题一股脑的直接丢给ChatGPT,如:用 Python 写个摔倒检测代码 是不可取的, 而是要像挤牙膏一样,一点一点引导ChatGPT得到准确的答案,从而才能真正让ChatGPT提高我们解决问题的效率。今天分享的摔倒识别案例,与ChatGPT对话的思路清晰,代码可用度高,按照GPT返回的结果完全可以开

自 2020 年以来,内容开发领域已经感受到人工智能工具的存在。1.Jasper AI网址:https://www.jasper.ai在可用的 AI 文案写作工具中,Jasper 作为那些寻求通过内容生成赚钱的人来讲,它是经济实惠且高效的选择之一。该工具精通短格式和长格式内容均能完成。Jasper 拥有一系列功能,包括无需切换到模板即可快速生成内容的命令、用于创建文章的高效长格式编辑器,以及包含有助于创建各种类型内容的向导的内容工作流,例如,博客文章、销售文案和重写。Jasper Chat 是该

1970年,机器人专家森政弘(MasahiroMori)首次描述了「恐怖谷」的影响,这一概念对机器人领域产生了巨大影响。「恐怖谷」效应描述了当人类看到类似人类的物体,特别是机器人时所表现出的积极和消极反应。恐怖谷效应理论认为,机器人的外观和动作越像人,我们对它的同理心就越强。然而,在某些时候,机器人或虚拟人物变得过于逼真,但又不那么像人时,我们大脑的视觉处理系统就会被混淆。最终,我们会深深地陷入一种对机器人非常消极的情绪状态里。森政弘的假设指出:由于机器人与人类在外表、动作上相似,所以人类亦会对

好嘞,今天我们继续剖析下Python里的类。[[441842]]先前我们定义类的时候,使用到了构造函数,在Python里的构造函数书写比较特殊,他是一个特殊的函数__init__,其实在类里,除了构造函数还有很多其他格式为__XXX__的函数,另外也有一些__xx__的属性。下面我们一一说下:构造函数Python里所有类的构造函数都是__init__,其中根据我们的需求,构造函数又分为有参构造函数和无惨构造函数。如果当前没有定义构造函数,那么系统会自动生成一个无参空的构造函数。例如:在有继承关系


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具