&n">
首页 数据库 mysql教程 开发自己的Data Access Application Block[上篇]

开发自己的Data Access Application Block[上篇]

Jun 07, 2016 pm 03:48 PM
access application data 开发 自己的

经常在网上看到对ORM的讨论沸沸扬扬,我也来凑个热闹,谈谈我写的一个ORM。最近在做一项工作,把我们经常用到的一些业务逻辑抽象出来,写成一个个的Application Block,使之可以运用到不同的Application中,比如Data Access,Messaging,Auditing,Data bind

经常在网上看到对ORM的讨论沸沸扬扬,我也来凑个热闹,谈谈我写的一个ORM。最近在做一项工作,把我们经常用到的一些业务逻辑抽象出来,写成一个个的Application Block,使之可以运用到不同的Application中,比如Data Access,Messaging,Auditing,Data binding等等。现在先做一个Data access application block。由于时间仓促,没有进行什么优化和较多的测试,大家不必深究我所提供的Code ,我只希望为大家的ORM提供另一种想法。

这个application block应达到的目的:

  • 封装所有的Data Access操作。

  • 适合主流的DBMS:SQL Server(2000和2005),Oracle(9i和10g),DB2。

  • 尽量简化Developer的操作和提供最大的灵活性,在Data Retrieval方面,只要指定SQL或者Stored Procedure和相应的参数;在Data Update方面,既可以直接调用SQL和Stored Procedure,还可以把包含多个相互关联Data Table的Dataset通过一次调用实现数据的更新。此外,可以自由地选择使用SQL还是Stored procedure;可以使用Commander builder生成Command或者使用基于Mapped stored procedure生成的Command进行数据更新。

  • 实现泛型编程,使使用该AppBlock的代码能够适合所有的数据库。

  • 实现Transaction。

  • 提供可配置性,包括不同数据库的配置,不同Data Mapping的配置等等。

下面是该AppBlock使用到的Entity:
开发自己的Data Access Application Block[上篇]

  • Database:Abstract Class,封装了绝大部分和具体数据库无关的Data Access操作逻辑。通过两个Mapping:IDbParameterNameMapping和IStoredProcedureNameMapping,实现Dataset和Db的一个映射。比如Dataset中Data table name和Stored procedure name的Mapping,Data table中Field和Stored procedure中参数名的Mapping。这两个Mapping是可以配置的,你只需要实现提供的Interface编写适合你的Mapping provider就可以了。

  • SqlDatabase:封装基于SQL Server 的操作。ADO.NET 2.0在1.0的基础上作了很大的改善,主要的增加的大量的基类,为我们进行泛型编程,编写和具体Db无关的代码变得异常容易。所以我们把大多数Data Access的操作可以封装在Abstract Database类中,SqlDatabase中的内容实际上是很少的。

  • OracleDatabase:封装基于Oracle的操作。

  • IDbParameterNameMapping和IStoredProcedureNameMapping:我想大家都是这样的感受,实现ORM的本质就是实现内存中的数据(主要是Dataset)和数据库的一个映射。在Dataset和数据库中的Table相互Mapping方面,我觉得没有必要采用特殊的Mapping,直接和简单易行的就是Table和Dataset中的Data Table完全匹配(table name 和field name完全匹配)。所以重要的是实现Dataset和Stored procedure的Mapping:Table Name如何与进行Insert,Update,Delete的Stored procedure name匹配,不同Version(original & current)的Field如何与Stored procedure的Parameter name 匹配。而这样一个匹配应该是可配置的,因为每个Application在数据库设计时的命名都有各自的要求,所以我在这里采用的Provider的设计模式。用户可以实现这两个Interface编写适合自己的Mapping provider,通过我提供的Configuration block很容易地完成配置。同时,我写了一个默认的,简单的Mapping:SimpleDbParameterNameMapping和SimpleStoredProcedureNameMapping。

      有一点需要补充的是,要实现上面的Mapping,对Stored Procedure的命名有较高的要求,手工编写的方式已经不能适合我们的要求,所以我们需要一个生成Stored procedure的Generator,这个Generator也使用这两个可配置的Mapping接口。

  • DatabaseFactory: 一个静态的类,根据配置的信息创建你需要的具体的Database对象,实现泛型化编程。

  • DataAccessConfigurationCollection,DataAccessConfigurationElement,DataAccessConfigurationdiv 三个Configuration的Class。

为了使大家清楚地看出这个Application block所有的操作,我把所有的操作封装在一个IDatabase的interface中,不过需要注意的是,我采用的是基于Abstract class的编程,而不是基于Interface的编程,相信大家对这两种方式讨论得已经碰倒的太多了,孰优孰劣我就不想对说了。这个IDatabase 接口,只是展示所有Operation之用,并没有在我的代码中用到。

开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]namespace Artech.ApplicationBlock.DataAccess
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]    
public interface IDatabase
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Fill a System.Data.DataSet with retrieved data.#region Fill a System.Data.DataSet with retrieved data.
开发自己的Data Access Application Block[上篇]        
void FillDataSet(DataSet dataInfo, string commandText, IDictionarystringobject> parameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void FillDataSet(DataSet dataInfo, string tableName, string commandText, IDictionarystringobject> parameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void FillDataSet(DataSet dataInfo, string tableName, CommandType commandType, string commandText, IDictionarystringobject> parameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Save the changed data which is stored in a dataset into database.#region Save the changed data which is stored in a dataset into database.
开发自己的Data Access Application Block[上篇]        
void UpdateData(DataSet dataInfo);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void UpdateData(DataTable table);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void UpdateData(DataTable table, string insertCommandText, string updateCommandText, string deleteCommandText,
开发自己的Data Access Application Block[上篇]           Dictionary
stringobject> insertParameters, Dictionarystringobject> updateParameters, Dictionarystringobject> deleteParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]                
void UpdateData(DataTable table, CommandType commandType, string insertCommandText, string updateCommandText, string deleteCommandText,
开发自己的Data Access Application Block[上篇]            Dictionary
stringobject> insertParameters, Dictionarystringobject> updateParameters, Dictionarystringobject> deleteParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
void UpdateData(DataTable table, DbCommand insertCommand, DbCommand updateCommand, DbCommand deleteCommand);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Execute a command and return the affect row count.#region Execute a command and return the affect row count.
开发自己的Data Access Application Block[上篇]        
int ExecuteNonQuery(CommandType commandType, string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
int ExecuteNonQuery(CommandType commandType, string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
int ExecuteNonQuery( string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
int ExecuteNonQuery( string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Execute a command and return the data in the form of data reader.#region Execute a command and return the data in the form of data reader.
开发自己的Data Access Application Block[上篇]        DbDataReader ExecuteReader(CommandType commandType, 
string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        DbDataReader ExecuteReader(CommandType commandType, 
string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        DbDataReader ExecuteReader(
string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        DbDataReader ExecuteReader(
string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Execute a command and return a scalar value.#region Execute a command and return a scalar value.
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
object ExecuteScalar(CommandType commandType, string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
object ExecuteScalar(CommandType commandType, string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
object ExecuteScalar(string commandText, Dictionarystringobject> inputParameters, Dictionarystringobject> outputParameters);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]        
object ExecuteScalar(string commandText, Dictionarystringobject> inputParameters);
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
Transaction based operation#region Transaction based operation
开发自己的Data Access Application Block[上篇]        
void BeginTransaction();
开发自己的Data Access Application Block[上篇]        
void Commit();
开发自己的Data Access Application Block[上篇]        
void RollBack();
开发自己的Data Access Application Block[上篇]        
#endregion

开发自己的Data Access Application Block[上篇]    }

开发自己的Data Access Application Block[上篇]}

开发自己的Data Access Application Block[上篇]

这个列表和大部分ORM没有什么太大的区别,大家已经司空见惯,实现起来也不会有什么太大的困难。对于大部分操作,我不会做详细的介绍。接下来我们来简要地看看这样一个AppBlock是如何实现的。
1. Data Mapping

我们首先来看看Data Mapping:实现Dataset中Table name和Stored Procedure Name的Mapping,以及Dataset 中的Field 和Stored procedure的参Parameter name的Mapping。

IDbParameterNameMapping

开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]using System;
开发自己的Data Access Application Block[上篇]
using System.Collections.Generic;
开发自己的Data Access Application Block[上篇]
using System.Text;
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]
namespace Artech.ApplicationBlock.DataMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
/**//// 


开发自己的Data Access Application Block[上篇]    
/// IStoredProcedureNameMapping defines the mapping between the data table name and the name of stored procedures to perform insertion, modification and deletion operation.
开发自己的Data Access Application Block[上篇]    
/// 
开发自己的Data Access Application Block[上篇]    public interface IStoredProcedureNameMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the name of stored procedure to perform seletion operation.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The name of the database table.
开发自己的Data Access Application Block[上篇]        
/// The name of stored procedure to perform seletion operation

开发自己的Data Access Application Block[上篇]        string GetSelectStoredProcedureName(string tableName);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the name of stored procedure to perform insert operation.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The name of the database table.
开发自己的Data Access Application Block[上篇]        
/// The name of stored procedure to perform insertion operation

开发自己的Data Access Application Block[上篇]        string GetInsertStoredProcedureName(string tableName);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the name of stored procedure to perform modification operation.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The name of the database table.
开发自己的Data Access Application Block[上篇]        
/// The name of stored procedure to perform modification operation

开发自己的Data Access Application Block[上篇]        string GetModifyStoredProcedureName(string tableName);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the name of stored procedure to perform deletion operation.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The name of the database table.
开发自己的Data Access Application Block[上篇]        
/// The name of stored procedure to perform deletion operation

开发自己的Data Access Application Block[上篇]        string GetDeleteStoredProcedureName(string tableName);
开发自己的Data Access Application Block[上篇]    }

开发自己的Data Access Application Block[上篇]}

开发自己的Data Access Application Block[上篇]

IDbParameterNameMapping

开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]using System;
开发自己的Data Access Application Block[上篇]
using System.Collections.Generic;
开发自己的Data Access Application Block[上篇]
using System.Text;
开发自己的Data Access Application Block[上篇]
using System.Data;
开发自己的Data Access Application Block[上篇]
namespace Artech.ApplicationBlock.DataMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
/**//// 


开发自己的Data Access Application Block[上篇]    
/// IDbParameterNameMapping define the defult mapping between the source column name and the parameter name of the corresponding stored procedure.
开发自己的Data Access Application Block[上篇]    
/// 
开发自己的Data Access Application Block[上篇]    public interface IDbParameterNameMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the source column name based on the parameter name of the related stored procedure.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The parameter name of the corresponding stored procedure.
开发自己的Data Access Application Block[上篇]        
/// The source column name corresponding to the parameter name.

开发自己的Data Access Application Block[上篇]        string GetSourceCoulmnName(string patameterName);
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]        
/**//// 
开发自己的Data Access Application Block[上篇]        
/// Get the source parameter name based on the source column name.
开发自己的Data Access Application Block[上篇]        
/// 
开发自己的Data Access Application Block[上篇]        
/// The source column name corresponding to the parameter name.
开发自己的Data Access Application Block[上篇]        
/// The data row version of the source solumn conressponding to the parameter.
开发自己的Data Access Application Block[上篇]        
/// The parameter name of the corresponding stored procedure.

开发自己的Data Access Application Block[上篇]        string GetParameterName(string columnName, DataRowVersion rowVersion);
开发自己的Data Access Application Block[上篇]    }

开发自己的Data Access Application Block[上篇]}

开发自己的Data Access Application Block[上篇]

这两个Mapping主要用在通过Dataset跟新数据库的场景,利用IDbParameterNameMapping,我们通过Dataset中各个Table name获得对它进行Insert,Update,Delete操作的Stored procedure的name。利用IDbParameterNameMapping,我们可以为Stored procedure的Parameter指定对应的Source field.  

注:GetParameterName方法实际上是不需要的,我把使用在另一个AppBlock中。

接下来我们来写两个实现了上面连个Interface的默认的mapping:SimpleStoredProcedureNameMapping和SimpleDbParameterNameMapping。他实际上实现了这样的Mapping:比如Table name为T_ABC_DEF(我经常用的命名方式:以T开头代表Table,名称大写并一下划线连接),那么对应的Stored procedure name分别为:sp_abc_def_s(Select), sp_abc_def_i(Insert), sp_abc_def_u(Update), sp_abc_def_d(delete)。如果Field name为ABC_123,那么对于Original version的Parameter name为o_abc_123(o代表Original),Current version的Parameter name为p_abc_123(p代表一般意义的Parameter)。

开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]using System;
开发自己的Data Access Application Block[上篇]
using System.Collections.Generic;
开发自己的Data Access Application Block[上篇]
using System.Text;
开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]
namespace Artech.ApplicationBlock.DataMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
/**//// 


开发自己的Data Access Application Block[上篇]    
/// IStoredProcedureNameMapping defines the mapping between the data table name and the name of stored procedures to perform insertion, modification and deletion operation.
开发自己的Data Access Application Block[上篇]    
/// 
开发自己的Data Access Application Block[上篇]    public class SimpleStoredProcedureNameMapping:IStoredProcedureNameMapping
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]    
开发自己的Data Access Application Block[上篇]{
开发自己的Data Access Application Block[上篇]开发自己的Data Access Application Block[上篇]

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Windows11怎么禁用后台应用程序_Windows11禁用后台应用教程 Windows11怎么禁用后台应用程序_Windows11禁用后台应用教程 May 07, 2024 pm 04:20 PM

1、在Windows11中打开设置。您可以使用Win+I快捷方式或任何其他方法。2、转到应用程序部分,然后单击应用程序和功能。3、查找要阻止在后台运行的应用程序。单击三点按钮并选择高级选项。4、找到【后台应用程序权限】部分并选择所需的值。默认情况下,Windows11设置电源优化模式。它允许Windows管理应用程序在后台的工作方式。例如,一旦启用省电模式以保留电池,系统将自动关闭所有应用程序。5、选择【从不】可防止应用程序在后台运行。请注意,如果您注意到程序不向您发送通知、无法更新数据等,您可

deepseek怎么转换pdf deepseek怎么转换pdf Feb 19, 2025 pm 05:24 PM

DeepSeek 无法直接将文件转换为 PDF。根据文件类型,可以使用不同方法:常见文档(Word、Excel、PowerPoint):使用微软 Office、LibreOffice 等软件导出为 PDF。图片:使用图片查看器或图像处理软件保存为 PDF。网页:使用浏览器“打印成 PDF”功能或专用的网页转 PDF 工具。不常见格式:找到合适的转换器,将其转换为 PDF。选择合适的工具并根据实际情况制定方案至关重要。

field在java中是什么意思 field在java中是什么意思 Apr 25, 2024 pm 10:18 PM

在Java中,"field"是类或接口中的数据成员,用于存储数据或状态。field的属性包括:类型(可为任何Java数据类型)、访问权限、static(属于类而非实例)、final(不可变)和transient(不序列化)。field用于存储类或接口的状态信息,例如存储对象数据和维护对象状态。

oracle怎么读取dbf文件 oracle怎么读取dbf文件 May 10, 2024 am 01:27 AM

Oracle 可以通过以下步骤读取 dbf 文件:创建外部表,引用 dbf 文件;查询外部表,检索数据;将数据导入 Oracle 表。

Java反射机制如何修改类的行为? Java反射机制如何修改类的行为? May 03, 2024 pm 06:15 PM

Java反射机制允许程序动态修改类的行为,无需修改源代码。通过Class对象操作类,可以通过newInstance()创建实例,修改私有字段值,调用私有方法等。但应谨慎使用反射,因为它可能会导致意外的行为和安全问题,并有性能开销。

Java 函数开发中常见的异常类型及其修复措施 Java 函数开发中常见的异常类型及其修复措施 May 03, 2024 pm 02:09 PM

Java函数开发中常见的异常类型及其修复措施在Java函数开发过程中,可能遇到各种异常,影响函数的正确执行。以下是常见的异常类型及其修复措施:1.NullPointerException描述:当访问一个还未初始化的对象时抛出。修复措施:确保在使用对象之前对其进行非空检查。示例代码:try{Stringname=null;System.out.println(name.length());}catch(NullPointerExceptione){

vue中iframe跨域的方法 vue中iframe跨域的方法 May 02, 2024 pm 10:48 PM

在 Vue 中解决 iframe 跨域问题的方法:CORS:启用后端服务器中的 CORS 支持,在 Vue 中使用 XMLHttpRequest 或 fetch API 发送 CORS 请求。JSONP:使用后端服务器中的 JSONP 端点,在 Vue 中动态加载 JSONP 脚本。代理服务器:设置代理服务器转发请求,在 Vue 中使用第三方库(如 axios)发送请求并设置代理服务器 URL。

解读 Botanix:网络资产管理去中心化的 BTC L2(附交互教程) 解读 Botanix:网络资产管理去中心化的 BTC L2(附交互教程) May 08, 2024 pm 06:40 PM

昨日,BotanixLabs宣布累计完成1150万美元融资,PolychainCapital、PlaceholderCapital等参投。融资将用于构建去中心化的EVM等效BTCL2Botanix。Spiderchain结合了EVM的易用性与比特币的安全性。自2023年11月测试网上线以来,已有超过20万个活跃地址。Odaily将于本文解析Botanix的特色机制与测试网交互流程。Botanix按照官方定义,Botanix是一个基于比特币构建的去中心化的图灵完备L2EVM,由两个核心组件以太坊虚

See all articles