The .NET ORM Architecture(.Net ORM 架构)

.NET Clean Architecture实践指南:构建可维护的企业级应用架构 软件架构设计是构建可维护、可扩展系统的核心基础,其中分离关注点原则是确保代码质量的关键。通过依赖倒置和分层设计,可以将核心业务逻辑与基础设施实现解耦,从而提高系统的可测试性和技术栈灵活性。Clean Architecture作为这一理念的经典实践,通过同心圆模型定义了清晰的依赖关系规则,内层领域模型完全独立于外部框架和数据库。在.NET技术栈中,结合领域驱动设计(DDD)的富领域模型和CQRS模式,能够有效解决业务逻辑与基础设施代码纠缠的常见痛点。本文基于ronnythedev/dotnet-clean-a 阅读详情

The .NET ORM Architecture(.Net ORM 架构)

一、Grove描述

Grove是为.Net项目开发而设计的一个组件。Grove ORM Development Toolkit包含包含Grove和Toolkit两部分内容,Grove基于.Net框架,支持多数据,提供标准的拖曳、三层及多层的开发模式。

二、Grove工具包

Grove工具是一个基于.Net开发环境的附件,它能够从数据源直接查看到实体类与XML描述。例如单一对象或者关系对象(互相联系的对象),这里的几个抓图屏幕显示了它的一些描述。

三、The ObjectOperator

The ObjectOperator 与数据进行通信,它使用 AppSettingManager 来设置数据源,如设置数据库服务器的连接字符串。The ObjectOperator 使用Attributes决定在数据源中的字段与表与一个对象成员的映射关系,即字段与表做为一个持久性对象来使用与从数据源中返回一个对象成员属性。

The ObjectOperator 可能使用一个存在连接字符串来构造,或者你必须确保在当前项目的Web.Config文件中的ConfigurationSettings存在AppSettings节点,并设置Key属性值为"DBConnString",Value值为一个正确的连接字符串。

下面的例子显示了ObjectOperator的创建:

 

[System.Configuration.ConfigurationSettings.AppSettings["DBConnString"];]

ObjectOperator oo=new ObjectOperator();

 

[Custom Connection String]

ObjectOperator oo=new ObjectOperator("Server=localhost;Uid=sa;Pwd=sa;Database=sample");

 

ObjectOperator提供了下列方法,主要功能是从一个数据源中返回对象,或者返回给数据源对象。

Method

Description

Insert

Insert an object into the data source

Update

Update an object

Remove

Delete an object from the data source

RemoveChilds

Delete child objects

Retrieve

Returns an object from the data source

RetrieveChilds

Returns child objects from the data source

GetDataReader

Returns an IDataReader from the data source

GetObjectSet

Returns a collection of object values

GetObjectSource

Returns a DataSet which contain the data source of the object

GetCount

Returns a records count of the data source

BeginTranscation

Begins a transaction at the data source, if transactions are supported by the data source. 

Commit

Commits the current transaction.

Rollback

Rolls back the current transaction.

 

四、The ObjectQuery

这ObjectQuery被用来帮助ObjectOperator从数据源中获得对象,例如,ObjectOperator需要它来得到一个“QueryString”而加以执行,ObjectQuery使用Attributes关键字决定当前对象引用单表或多表。

一个ObjectQuery对象的构造,通过传递一个对象类型或一个过滤字符串给ObjectQuery的构造函数,详细过滤定义,参考Filter syntax (过滤语法)。例如,下面的ObjectQuery搜索所有State值等于“WA”的Customer对象。

ObjectQuery query=new ObjectQuery(typeof(Customer),"this.State='WA'");

为返回对象的所有数据类型,指定一个空的字符中作为你的过滤条件,如下例子:

ObjectQuery query=new ObjectQuery(typeof(Customer),"");

这Filter 允许你在关系对象中使用“Contains”关键字定义字查询,你可以查询出存在定单数据超过50的

所有Customer对象。

ObjectQuery query = new ObjectQuery(typeof(Customer),”Order.CustomerID.Contains(this.CustomerID)”);

query.DeclareSubset(typeof(Order),”Order.Quantity>50”);

五、The FilterExpression(过滤表达式)

这FilterExpression 是一个可扩展的过滤,即FilterExpression允许你偏离ObjectQuery来为一些操作构造许多复杂的条件,例如通过自定义条件来更新一个对象。

一个FilterExpression的创建,通过传递一个对象类型或传递一个过滤字符串给ObjectQuery的构造函数。

例如下面的FilterExpression定义了一个State等于“WA”的所有“Customer类型”的对象的过滤表达式。

FilterExpression filterex = new FilterExpression(typeof(Customer),”this.State=’WA’”);

这Filter 允许你在关系对象中使用“Contains”关键字定义字查询,你可以查询出存在定单数据超过50的所有Customer对象。

 

FilterExpression filterex=new FilterExpression(typeof(Customer),"Order.CustomerID.Contains(this.CustomerID)");
filterex.DeclareSubset(typeof(Order),"Order.Quantity>50");

有时,我们需要更新一个对象的属性,而不更新其它属性。例如,仅仅需要更新Customer对象中State属性值,通过自定条件,如下所示:

ObjectOperator oo=new ObjectOperator();
oo.Update(typeof(Customer),filerex,"this.Status=1");

这个例子意思是将定单数量(Order)大于50的所有客户(Customer)的“State”的值设为1。

Persisting Objects (持久性对象) 

一、Mapping Object Properties(映射对象属性)

         这Grove ORM architecture 要求每一个持久性对象包含一个属性,这个属性值表示一个来自数据源的表的名字,此表名标示符在Object Mapping (对象映射)中用DataTable属性关键字来表示。

当从一个数据源中映射过来时,这PK(主键字段)需要一个属性,来表示此字段为主键字段,例如,

[KeyField("CustomerID")]
public int CustomerID{get; set;}

如果这PK Field(主键字段)不唯一,你必须确保这“KeyType”是“UniquelType.OtherDefinition”,下面的例子表示了字段类型是一个数据不唯一的String(字符串)类型。

[KeyField("Field Name",KeyType=UniqueIDType.OtherDefinition)]
public string PropertyName{get; set;}

并且,这PK field也可以使用ForeignKeyField属性来表示来自数据源的一个字段名(外键)。、

[DataTable("Orders")]
public class Order
{
    [ForeignKeyField("CustomerID")]
    public int CustomerID{get; set;}
}

另外,其它字段也需要一个名为DataField的属性来表示来自数据源的表的字段。

[DataField("Field Name")]
public type PropertyName{get; set;}

当将数据源(表)映射成为对象时,你需要量将the .NET framework data provider data types 映射成为NET framework data types。

下面的表显示了.NET Framework type与Microsoft SQL Server, OLE DB, and ODBC.的比较。详细信息请参考.NET Framework Developer's Guide。

注意:在.NET Framework data provider data types下的Null值被取代为DBNull.Value。

.NET Framework Data Provider for SQL Server

SQL Server type

.NET Framework type

bigint

Int64

binary

Byte[]

bit

Boolean

char

String Char[]

datetime

DateTime

decimal

Decimal

float

Double

image

Byte[]

int

Int32

money

Decimal

nchar

String Char[]

ntext

String Char[]

numeric

Decimal

nvarchar

String Char[]

real

Single

smalldatetime

DateTime

smallint

Int16

smallmoney

Decimal

sql_variant

Object *

text

String Char[]

timestamp

Byte[]

tinyint

Byte

uniqueidentifier

Guid

varbinary

Byte[]

varchar

String Char[]

.NET Framework Data Provider for OLE DB

OLE DB type

.NET Framework type

DBTYPE_I8

Int64

DBTYPE_BYTES

Byte[]

DBTYPE_BOOL

Boolean

DBTYPE_BSTR

String

DBTYPE_HCHAPTER

Supported through the DataReader

DBTYPE_STR

String

DBTYPE_CY

Decimal

DBTYPE_DATE

DateTime

DBTYPE_DBDATE

DateTime

DBTYPE_DBTIME

DateTime

DBTYPE_DBTIMESTAMP

DateTime

DBTYPE_DECIMAL

Decimal

DBTYPE_R8

Double

DBTYPE_ERROR

ExternalException

DBTYPE_FILETIME

DateTime

DBTYPE_GUID

Guid

DBTYPE_IDISPATCH *

Object

DBTYPE_I4

Int32

DBTYPE_IUNKNOWN *

Object

DBTYPE_NUMERIC

Decimal

DBTYPE_PROPVARIANT

Object

DBTYPE_R4

Single

DBTYPE_I2

Int16

DBTYPE_I1

Byte

DBTYPE_UI8

UInt64

DBTYPE_UI4

UInt32

DBTYPE_UI2

UInt16

DBTYPE_UI1

Byte

DBTYPE_VARIANT

Object

DBTYPE_WSTR

String

DBTYPE_UDT

not supported

DBTYPE_VARNUMERIC

not supported

.NET Framework Data Provider for ODBC

ODBC type

.NET Framework type

SQL_BIGINT

Int64

SQL_BINARY

Byte[]

SQL_BIT

Boolean

SQL_CHAR

String
Char[]

SQL_DECIMAL

Decimal

SQL_DOUBLE

Double

SQL_GUID

Guid

SQL_INTEGER

Int32

SQL_LONG_VARCHAR

String
Char[]

SQL_LONGVARBINARY

Byte[]

SQL_NUMERIC

Decimal

SQL_REAL

Single

SQL_SMALLINT

Int16

SQL_TINYINT

Byte

SQL_TYPE_TIMES

DateTime

SQL_TYPE_TIMESTAMP

DateTime

SQL_VARBINARY

Byte[]

SQL_WCHAR

String Char[]

SQL_WLONGVARCHAR

String Char[]

SQL_WVARCHAR

String Char[]

下面的代码,表示一个简单的一个映射关系:

[DataTable("Customers")]
public class Customer
{
    int customerID;
    string customerName;
    int parentID;
    ....
    [KeyField("CustomerID")]
    public int CustomerID
    {
        get{return this.customerID;}
    }
    [DataField("CustomerName")]
    public string CustomerName
    {
        get{return this.customerName;}
        set{this.customerName=value;}
    }
    [ForeignKeyField("ParentID")] 
    public int ParentID
    {
        get{return this.parentID;}
        set{this.parentID=value;}
    }
}

二、Persisting Object Data(持久性对象数据)

ObjectOperator 为每一个对象提供了基本的持久性方法,比如insert、insert, update, delete以及从一个数据源返回一个对象,或者通过RetriveChilds,GetObjectSet等方法来获得一个相关的对象。

因此,程序员可以扩展这些方法为更多条件的选择,下面的代码显示了它的用法。

[DataTable("Customers")]
public class Customer
{
    int customerID;
    ...
    ArrayList orders=null;
    [KeyField("CustomerID")]
    public int CustomerID
    {
        get{return this.customerID;}
    }
    public ArrayList Orders
    {
        get{
            if(orders==null && customerID>0)
                orders=(new ObjectOperator()).RetrieveChilds(typeof(Order),customerID)
            return orders;
        }
    }
}

下面的例子给出了一些基本的用法:

[persist a new object ]
Customer c=new Customer();
c.CustomerName="rainbow co.";
oo.Insert(c);

[update an object]
c.CustomerID=1000;
c.CustomerName="rainbow-co.";
oo.Update(c);

[update an retrieved object]
Customer c=(Customer)oo.Retrieve(typeof(Customer),1000);
c.CustomerName="rainbow.co"
oo.Update(c);

[update an object with new regulation]
Product p=(Product)oo.Retrieve(tyoeof(Product),guidString);
p.ProductID=newGuidString;
oo.Update(p,"this.ProductID=guidString");

Note the existing KeyField type is UniqueIDType.OtherDefinition,and need to update that.

[update objects perproty without other properties ]
oo.Update(typeof(Customer),"this.CustomerID<1000","this.Status=2");

Note update status to 2 for customer objects with id small than 1000.

[delete an object]
oo.Remove(c);

[delete related child objects]
int customerID=1000;
oo.RemoveChilds(typeof(Order),customerID);

Note the Order object must be contain a ForeignKeyField attribute for the FK field(CustomerID

三、Retrieve Object Data(返回一个对象数据)

ObjectOperator提供了极其丰富的方式,通过ObjectQuery来返回一个对象或结果集合,详细信息请查看Query for objects。

下面的例子显示了它的基本用法:

[return an existing object]
Customer c=(Customer)oo.Retrieve(typeof(Customer),1000);

[return a related child collection]
ArrayList orders=oo.RetrieveChilds(typeof(Order),c.CustomerID);

[return a related child collection through ObjectQuery]
ArrayList orders=oo.GetObjectSet(new ObjectQuery(typeof(Order),"this.CustomerID="+c.CustomerID));

[return DataSet]
EntityData orders= oo.GetObjectSource(new ObjectQuery(typeof(Order),"this.CustomerID="+c.CustomerID));

Note EntityData is an object extends the DataSet from the System.Data namespace

四、Grove Transaction(事务)

这Grove 架构支持基本的事务处理方法,通过ObjectOperator对象下的BeginTransaction、Commit和Rollback方法。如果你的数据源支持事务,你可以使用这些方法。或者你也可以有选择支持isolation level(隔离级别), 通过从System.Data命令空间里使用IsolationLevel 枚举值。如果你不使用Isolation level,缺省使用ReadCommitted事务级别。

注意:引用System.Data命名空间。

oo.BeginTranscation();
try{
      oo.Insert(c);
      oo.Commit();
}
catch{
      oo.Rollback();
}

Querying for objects

一、Mapping Relation Object Properties

Grove 架构支持映射多表到一个对象——关系对象被用来做更复杂的查询,关系对象映射制授权你在两表之间指定连接类型,即你可以有选择地使用inner join、left outer join 、right outer join或者full join为一个属性,被用在表间的映射关系。

在映射时,关系必须包含一个成员,显示结果名(执行返回一个数据集)并指定FROM子句,在此成员的属性BeginWithTable中没有FROM关键字。下面的代码表明了怎样将多表映射成为一个关系对象,从数据源中选择需要返回的字段为这个对象。

[RelationTable("PersonRelationQuery",BeginWithTable="Person")]
public class PersonInfo
{
      [RelationReflect("Person","Address",JoinType=TableJOINType.LEFTOUTERJOIN)]
      [RelationField("Id","PersonID")]
      public string Relationship_1
      {
            get{return "[Person].[Id]=[Address].[PersonID]";} 
      } 
      int _Id;
      [DataField("Id",TableName="Person")]
      public int PersonId
      {
            get{return this._Id;}
            set{this._Id=value;}
      }
      string _Name;
      [DataField("Name",TableName="Person")]
      public string PersonName
      {
            get{return this._Name;}
            set{this._Name=value;}
      }
      string _Street;
      [DataField("Street",TableName="Address")]
      public string StreetInfo
      {
            get{return this._Street;}
            set{this._Street=value;} 
      }
}

Grove Toolkit中Relation Query Builder能够帮助你,随意映射。

二、Creating Object Queries

Object queries通过创建一个ObjectQuery 对象实例指定。关于ObjectQuery的更多细节,请查看The Object Query Overview.。

[no filter query]
ObjectQuery query=new ObjectQuery(typeof(Customer),"");

[filter query]
ObjectQuery query=new ObjectQuery(typeof(Customer),"this.State='WA'");

[object oriented syntax filter]
ObjectQuery query=new ObjectQuery(typeof(Customer),"this.State='WA' && this.Country=='USA'");

[sub-set with filter query]
ObjectQuery query=new ObjectQuery(typeof(Customer),"Order.CustomerID.Contains(this.CustomerID)"); query.DeclareSubset(typeof(Order),"Order.Quantity>50");

[sub-set without filter query]
ObjectQuery query=new ObjectQuery(typeof(Customer),"PersonInfo.PersonId.Contains(this.CustomerID)");
query.DeclareSubset(typeof(PersonInfo));

ObjectQuery允许用户使用AddCandidate方法来定义使用数据库函数,如COUNT、SUM、MAX、MIN等,下面例子显示了它们基本用法。

[count query]
ObjectQuery query=new ObjectQuery(typeof(Customer),"this.CustomerName<>''");
query.AddCandidate("this.CustomerID.size()");

NOTE the same as use query.AddCandidate("*.size()");

[sum query]
ObjectQuery query=new ObjectQuery(typeof(Person));
query.AddCandidate("this.Age.sum()");

[maximum query]
ObjectQuery query=new ObjectQuery(typeof(Person));
query.AddCandidate("this.Age.max()");

[minimum query]
ObjectQuery query=new ObjectQuery(typeof(Person));
query.AddCandidate("this.Age.min()");

[average query]
ObjectQuery query=new ObjectQuery(typeof(Person));
query.AddCandidate("this.Age.avg()");

四、Returning Objects

IDataReader reader=oo.GetDataReader(new ObjectQuery(typeof(Customer),""));

ArrayList customers=oo.GetObjectSet(new ObjectQuery(typeof(Customer),""));

EntityData result=oo.GetObjectSource(new ObjectQuery(typeof(Customer),""));

五、Using Filter

IDataReader reader=oo.GetDataReader(new ObjectQuery(typeof(Customer),"this.State='WA'"));

关于更多信息,请查看The ObjectQuery and The FilterExpression。

 

六、Using Sub-set for queries

 

ObjectQuery允许你定义子集查询,即可以使用“IN”或“NOT IN”来查询,需要使用Contains关键来。

[syntax]
Object.Property.Contains(this.Property)

Note NOT IN query need contain "!" before the head.

ObjectQuery query=new ObjectQuery(typeof(Customer));
query.Filter="Order.CustomerID.Contrains(this.CustomerID)";
query.DeclareSubset(typeof(Order),"Order.Quantity>50");
ArrayList customers=oo.GetObjectSet(query);

七、Filter Syntax

Filter是ObjectOperator被用来查询对象一个查询语言,Filter允许你使用标准面向对象语言的关系操作符来查询对象。在一个查询中你可以遍历对象的关系,也可以使用标准的面向对象关系操作符进行复杂的值比较。

Operator

Description

!, not

Used to perform a Boolean operation on a single value. For example:

!Order.CustomerID.Contains(Customer.CustomerID)

<, >, <= , >=

Used to compare one value to another. For example:

Order.Quantity >= 12

=, !=, <>, = =

Used to compare exact values. For example:

Customer.Country = 'USA' and Customer.Region != 'WA'

and, &&

Used to perform a logical junction. For example:

Customer.Country = 'USA' and Customer.Region = 'WA'

or, ||

Used to perform a logical disjunction. For example:

Customer.LastName = 'Smith' or Customer.LastName = 'Jones'

 

八、Order String(排序字符)

Order String 允许你在返回对象时控制排序。

[desc]
ObjectQuery query=new ObjectQuery(typeof(Customer),""); 
query.OrderString="this.CustomerID desc";

[multi order condition]
query.OrderString="this.CustomerName,this.GetDate desc"

 
01.02 Plug-in MVC Architecture 插件MVC架构 本文介绍了XAF(eXpressApp Framework)的插件式MVC架构。XAF应用程序由多个功能模块组成,核心包括: 数据存储层:通过ORM(支持XPO和Entity Framework Core)自动创建数据库结构,使用类定义数据表,属性定义字段 业务类库:提供常用实体类(如Person、Organization)和必需接口(如安全系统要求的IPermissionPolicyUser) 用户界面:基于相同业务逻辑自动生成多种UI,包括WinForms桌面应用和ASP.NET Core Blazor 阅读详情

相关推荐

轻松实现Grove.ORM

使用C#实现ORM,附有例子,调用了Grove.dll

Grove—— .Net下的ORM框架

.Grove—— .Net下的ORM框架 参见原文:http://grove.91link.com(英)Grove下载The .NET ORM Architecture(.Net ORM 架构)一、Grove描述Grove是为.Net项目开发而设计的一个组件。Grove ORM Development Toolkit包含包含Grove和Toolkit两部分内容,Grove基于.Net框架,支持多数

Jenry的专栏 2173

基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,通过建立PMSM非线性状态空间模型,设计IOL控制器将系统转化为线性输入-输出映射。文章包含系统原理推导、Simulink建模步骤、参数整定方法和仿真结果分析,验证了IOL在高动态、宽速域工况下的优越性能(转矩误差降低90%)。最后提出了工程实现要点和扩展应用方向,为开发高精度电机驱动系统提供了实用指导。

xiaoheshang_123的博客 304

Groovy语法大全

Groovy语法大全

运维@小兵的博客 5881

FPGA图像处理之直方图均衡实现

直方图均衡的基本原理,就是对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行拉伸,而对像素个数较少的灰度值(即对画面不起主要作用的灰度值)进行合并,从而提高对比度,使图像清晰,达到增强的目的。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

FZWzsl的博客 1428

Android蓝牙Mesh组网实战:从零搭建智能灯光控制系统(附完整代码)

本文详细介绍了基于Android平台开发蓝牙Mesh智能灯光控制系统的完整实战流程。从环境搭建、核心概念解析,到设备扫描配网、网络初始化、模型配置与消息通信,提供了完整的代码实现和调试技巧。重点讲解了如何使用开源Mesh库实现设备发现、分组控制、场景管理等核心功能,并分享了实际项目中遇到的典型问题与解决方案。

weixin_29174013的博客 656

.Grove—— .Net下的ORM框架

.Grove—— .Net下的ORM框架       参见原文:http://grove.91link.com(英)   Grove下载   The .NET ORM Architecture(.Net ORM 架构)   一、Grove描述   Grove是为.Net项目开发而设计的一个组件。Grove ORM Development Toolkit包含包含Gro...

weixin_34143774的博客 164

基于 C# 实现 RTSP 摄像头监控分屏系统:从流媒体获取到多画面显示

通过本文的讲解,我们介绍了如何在 C# 中实现 RTSP 摄像头监控分屏系统。我们使用了FFmpeg和VLC两种不同的方法来获取和解码 RTSP 流,并通过PictureBox控件和控件实现了分屏布局。两种解码方案都非常强大,可以根据实际需求选择最适合的方案。通过这种方式,您可以轻松地在 C# 中集成 RTSP 流,并将多个摄像头的视频流实时显示在同一屏幕上,进行监控和分析。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2309

groovy 入门

一、groovy是什么 简单地说,Groovy 是下一代的java语言,跟java一样,它也运行在 JVM 中。 作为跑在JVM中的另一种语言,groovy语法与 Java 语言的语法很相似。同时,Groovy 抛弃了java烦琐的文法。同样的语句,使用groovy能在最大限度上减少你的击键次数——这确实是“懒惰程序员们”的福音。   二、开发环境 1、  jdk 1.5以上 2、  ...

不疯的疯子 1592

华为OD机试真题 新系统 9月16号 【园区基站节能部署规划】

华为OD机试真题 新系统【园区基站节能部署规划】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【园区基站节能部署规划】多语言题解。

qq_45776114的博客 357

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1202

Groovy笔记(2)_表达式与运算符

表达式与运算符 可参考Groovy in Action P64 1、a==b 等价 a.equals(b)2、Groovy的"===" 就是Java的"=="3、Groovy支持操作符重载,重载运算符对应的方法就是操作符重载4、5、?: 安全引用操作符(防止NullPointerException),在方法调用前面添加一个?就相当于再调用前面放了一个条件,   

escaflone的专栏 1万+

OpenCV 实战篇——如何测算出任一副图片中的物体的实际尺寸?传感器尺寸与像元尺寸的关系?

本文介绍了通过相机图像测算物体实际尺寸的方法,重点分析了传感器参数与成像质量的关系。文章首先给出了物体实际尺寸的计算公式,涉及像素尺寸、距离、分辨率等参数。然后详细解析了传感器尺寸与像元尺寸的关系,指出相同分辨率下更大的传感器能获得更好的成像质量。此外还介绍了光学尺寸、像素尺寸对成像的影响,以及帧率的概念。最后提及了相机标定的重要性,并概述了从像素坐标系转换到世界坐标系的基本思路。这些知识为通过相机图像进行精确测量提供了理论基础。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1336

Clean-Architecture-CQRS:构建高性能.NET应用的解决方案

Clean-Architecture-CQRS:构建高性能.NET应用的解决方案 项目介绍 Clean-Architecture-CQRS 是一个使用纯.NET 8 实现的模板和示例项目。它采用了清洁架构(Clean Architecture)与命令查询职责分离(CQRS)模式,旨在提供一个强大、灵活的软件设计,能够轻松适应变化并保持可维护性。通过分离命令和查询,项目优化了应用的状态管理和数据检索...

gitblog_00433的博客 1289

57、各向异性材料力学问题的分析与求解

本文系统分析了各向异性材料在扭转和平面变形问题中的力学行为,介绍了基于应力和位移的求解方法,包括应力函数推导、位移场假设、艾里应力函数法等。通过具体示例,如椭圆截面杆的扭转和各向异性板的均匀拉伸,展示了求解过程,并讨论了各向异性材料在工程应用中的意义及未来研究方向。

7h6j5k4l3的博客 204

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ASP.NET-Core-Vertical-Slice-Architecture:构建高效可维护的软件架构

ASP.NET-Core-Vertical-Slice-Architecture:构建高效可维护的软件架构 在软件开发领域,追求高效、可维护的架构是每个开发者的目标。ASP.NET-Core-Vertical-Slice-Architecture 是一个开源项目,通过实现垂直切片架构、CQRS(命令查询职责分离)、REST API、DDD(领域驱动设计)以及 SOLID 原则,为开发者提供了一种清...

gitblog_00726的博客 723

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

推荐项目:Clean Architecture——构建健壮的ASP.NET Core应用

推荐项目:Clean Architecture——构建健壮的ASP.NET Core应用 在追求代码质量和系统可维护性的路上,Clean Architecture项目如同一盏明灯,为.NET开发者照亮了领域驱动设计(DDD)和干净架构实践的道路。基于ASP.NET Core 7平台,这一解决方案不仅融入了现代软件开发的最佳实践,还提供了从快速启动到深入开发的全面指南。 项目简介 Clean Arc...

gitblog_00848的博客 944

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

学习003 Plug-in MVC Architecture(插件式 MVC 架构 )

这就是您获得一个存储联系信息的应用程序所需要的一切。它们还负责最终用户交互。即使是使用XAF构建的最简单的应用程序也使用许多随系统模块和附加模块提供的内置控制器。要更改应用程序使用的DBMS,请按照以下主题中的说明修改连接字符串:将XAF应用程序连接到数据库提供程序。通常,这些是显示您使用的集合(数据表)的网格。当您开始项目时,您会看到其中一个,并且您可以使用导航系统在它们之间切换。模块是一种即用型功能,可以集成到您的XAF应用程序中。例如,此信息包括用于特定数据类型的编辑器类,或与特定字段关联的标签。

DevExpress Xaf 学习专栏 1413

NorthwindTraders:基于Clean Architecture的ASP.NET Core电商系统完整指南

NorthwindTraders是一个基于ASP.NET Core和Clean Architecture(清洁架构)的完整电商系统,它为开发者提供了学习现代.NET开发最佳实践的完美示例。这个项目展示了如何构建一个功能完善的电商平台,包含商品管理、客户管理、订单处理等核心功能。 ## 🏗️ 项目架构解析 NorthwindTraders采用典型的Clean Architecture分层设计,

gitblog_00524的博客 769

清洁架构(Clean Architecture)解决方案模板指南

清洁架构(Clean Architecture)解决方案模板指南 【免费下载链接】CleanArchitecture Jason Taylor开发的Clean Architecture项目模板同样基于.NET Core,遵循干净架构原则。它提供了一种组织代码结构的良好起点,鼓励面向接口编程和关注点分离,适用于需要长期维护...

gitblog_00772的博客 578

Microsoft .NET Architecting Applications for the Enterprise

12/18/2011看完了《Microsoft .NET Architecting Applications for the Enterprise》,觉得受益颇多。现在看代码觉得比以前更有洞察力了。下一步要看的书是Fowler的《Patterns of Enterprise Application Architecture》,这一本看完以后看一本ORM的书《Programming Entity F

albertliangyg的专栏 831

.NET 10实战:Clean Architecture + EF Core + Copilot Agent搭建Web API

现代Web API开发中,架构分层与数据访问一直是工程实践的核心话题。Clean Architecture强调依赖规则,通过Domain、Application、Infrastructure与Api四层划分,确保业务核心不依赖外部框架;EF Core作为现代.NET生态的ORM,其DbContext本身就具备仓储与工作单元能力,合理设置边界可避免过度设计。同时,AI编程助手的普及正在改变开发流程,Copilot Agent不仅能生成代码,还能在明确约束下辅助完成跨层架构搭建。本文以.NET 10 LTS为背

diaoju3333的博客 330

.NET 10 Web API接入AI:Clean Architecture与EF Core实践

在现代后端开发中,架构分层与数据访问是构建可维护系统的基石。Clean Architecture 通过明确领域、应用、基础设施与表示层的边界,让业务逻辑与外部依赖解耦,从而提升代码的可测试性与可扩展性。EF Core 作为 .NET 生态中的主流 ORM,简化了数据库迁移、查询与事务处理。随着大模型能力快速普及,将 AI Agent 集成到 Web API 中已成为企业级应用的新趋势。本文基于 .NET 10 Web API 项目,展示如何以 Clean Architecture 为骨架、EF Core 为

weixin_34318272的博客 345

Clean-Architecture-And-Domain-Driven-Design-Solution-Template 的安装和配置教程

Clean-Architecture-And-Domain-Driven-Design-Solution-Template 的安装和配置教程 1. 项目基础介绍和主要编程语言 本项目是一个基于整洁架构(Clean Architecture)和领域驱动设计(Domain-Driven Design,简称DDD)的解决方案模板。它旨在提供一个清晰、模块化的项目结构,帮助开发者在构建复杂应用程序时保持代...

gitblog_00940的博客 414

Simple NHibernate Architecture[from]

原文地址:http://www.codeproject.com/aspnet/NHibernateArchitecture.aspDownload source - 2,523.7 KB Introduction I started using NHibernate at the end of last year and I am having a wonderful experi...

weixin_30652897的博客 113
上一篇: java相关
下一篇: java,I love!
cpsing
博客等级 码龄20年 0粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值