.NET 应用程序框架 (Spring.net + ibatis.net)
C# 框架集成 spring.net 和 ibatis.net
1. 引言
Java 项目有很多与 spring + ibatis 集成的优秀框架。但在 .NET 项目中,我们很难找到集成了 spring.net+ibatis.net 的示例框架。本文将提供一个集成了 spring.net 和 ibatis.net 的示例框架,并重点介绍如何创建一个统一的数据访问层。尽管本文标题是“集成 spring 和 ibatis”,但更重要的是提供一个健壮、灵活的框架。在此,我还提供了一个帮助工具,可以通过简单的配置生成此框架的基本代码文件。借助该工具,开发人员可以专注于在此框架基础上进行业务逻辑开发。
2. 使用代码
我将通过附带的演示项目来解释这个框架。这是一个非常简单的示例。MS Access 数据库文件包含一个名为 `userinfo` 的表,该表包含三列:`FirstName`、`SecondName` 和 `FamilyName`。该演示项目提供了该表数据的 `读取`/`插入`/`删除` 功能。
2.1. 看看操作 Users.mdb 表有多简单
首先,我们需要创建一个实体类,下面是接口。
public partial interface Iuserinfo:IBaseEntity
{
string FirstName{get;set;}
string SecondName{get;set;}
string FamilyName{get;set;}
}
其次,我们需要一个 DataMapper 类。
public partial class userinfoDataMapper : usersDataMapper<iuserinfo>
{
}
public partial class usersDataMapper<tentity>:BaseDataMapper<tentity> where TEntity : class
{
public override ISqlMapper Mapper
{
get
{
if (mapper == null)
mapper = new InfrastructureFactory().GetSqlMapper("users");
return mapper;
}
set
{
mapper = value;
}
}
}
数据访问层的关键是 `BaseDataMapper` 类,它是一个 `abstract` 类,并提供了所有表的 `insert`/`delete`/`read`/`update` 操作的 `virtual` 方法。您无需实现其中任何一个方法,只需将您的 `DataMapper` 类继承自 `BaseDataMapper` 类,就可以操作您的表了。
第三,在此框架中,定义了一个域服务层来对表进行一些复杂的操作,因此,在这里,您需要定义另一个 `domainservice` 类。
public partial class userinfoService:BaseDomainService<Iuserinfo>,IuserinfoService
{
}
最后,正如标题所示,该框架集成了 ibatis.net 和 spring.net。因此,要访问表数据,您需要创建 ibatis 配置片段。
添加新表到您的项目中,以上这四个步骤几乎就是您需要做的全部工作。
现在让我们看看如何在应用程序中执行表数据操作。
从上下文中获取服务。
IuserinfoService Service
{
get { return (IuserinfoService)DomainServicesContext.Context.GetObject("userinfoService"); }
}
读取 `userinfo` 表中的所有记录
void ReadAllUsers()
{
var list=Service.GetList<iuserinfo>("",null);
if (list.Count == 0) Console.WriteLine("There is no any user record.");
foreach (var item in list)
{
Console.WriteLine("My Name is {0} {1} {2}",
item.FirstName, item.SecondName, item.FamilyName);
}
}
向 `userinfo` 表中添加一条新记录
void AddNewUser()
{
Iuserinfo userInfo = new userinfo();
userInfo .FirstName= Console.ReadLine();
userInfo.FamilyName = Console.ReadLine();
Service.Insert(userInfo);
}
从 `userinfo` 表中删除一条记录
void DeleteOneUser()
{
Iuserinfo userInfo = new userinfo();
userInfo.FirstName = Console.ReadLine();
userInfo.FamilyName = Console.ReadLine();
Service.Delete(userInfo);
}
以上就是我的目标——为应用程序数据层提供一个统一的访问模型。
2.2. 框架结构图
下图显示了这个框架的基本结构。该框架除了视图层之外,为应用程序提供了多个层。作为示例,您可以选择任何您喜欢的视图显示方式。
示例运行要求
- Microsoft Access ODBC 驱动程序
- .NET 4.0
3. 如何使用工具生成示例
我为这个框架创建了一个源代码生成工具。使用这个工具,您只需要进行一些简单的配置,然后该工具就会帮助您生成框架的 C# 代码文件。目前,它将支持以下数据库
- Microsoft Access
- IBM DB2
- MySQL
3.1. 帮助工具下载
3.2. 使用工具生成源代码的手册
1. 配置您的项目基本信息,然后单击“添加新项目”按钮来创建您的项目数据。
2. 配置数据库信息
单击“**编辑数据库信息**”按钮打开一个新窗口来配置您的数据库信息。
单击“**添加**”按钮注册您的数据库信息。
3. 编辑实体
如果您想编辑实体详情,也可以在 `MainWindow` 上单击“**编辑项目信息**”按钮,打开一个如下所示的屏幕。这是一个 Excel 文件,您可以以 Excel 格式编辑实体信息并更新到数据库。
4. 生成源代码
现在返回 `MainWindow` 并单击“**自动生成源文件**”按钮来为您的项目生成基本的框架源代码文件。
该工具将创建一个 zip 文件,其中包含框架所需的所有文件。您只需将其解压到本地即可开始您的项目编码。
4. 框架详解
4.1. 框架目录结构详解
有三个一级目录:AutoGen/Customize/Resources
- AutoGen
由工具生成且无需开发人员编辑的文件将放在此目录中。因此,框架基本文件、域实体定义文件、接口文件将放在此目录中。在此目录下,有五个子目录
- Domain.Objects:域实体类
- Infrastructure:(数据库)基础设施操作类
- Domain.Services:域服务类
- App.Services:应用服务类
- Common:框架通用和实用类
- 自定义
由开发人员实现或定义的任何类都可以放在此目录中。这是开发人员可以自定义逻辑的地方。在此目录中,包含以下四个子目录
- Infrastructure:(数据库)基础设施操作类
- Domain.Services:域服务类
- App.Services:应用服务类
- Common:框架通用和实用类
- 资源
此目录还包含 AutoGen 和 Customize 子目录。含义类似,AutoGen 中的所有文件都可以由工具生成,无需编辑。开发人员可以自由编辑 Customize 中的所有文件。
4.2. 框架逻辑详解
- 域对象层
域对象层是最简单的层,它包含所有实体类。事实上,我正试图构建这个框架以适应领域驱动设计。因此,根据 DDD 中的概念,按照类图所示进行了以下接口设计。但这里只是一个简单的模型,有关详细信息,您可以参考网站并扩展接口。如果您有其他想法,也可以与我联系以改进此框架。总之,这只是一个简单的层,关于实体类的东西。
- 基础设施层
这是为数据库提供数据操作功能的层。或者称之为 DAO。但在这里,我正试图基于实体设计一个统一的访问接口。因此,所有接口都汇总在 `IDataContext` 接口文件中。在 `IDataContext` 中,所有方法都是泛型方法,可以适应不同的实体。因此,开发人员只需要在 XML 配置文件中定义 Ibatis SQL 语句,框架就会为您完成所有映射,然后您就可以在统一的接口中访问数据,而无需关心每个实体的映射代码。当然,如果您需要,也可以自定义数据访问接口。
- 域服务层
这也很简单,如下面的类图所示。`IBaseDomainService` 也包含一些统一的接口,通过基础设施层的接口访问数据,但您可以自由扩展接口。此层的目标是对实体进行简单的操作集成。
- 应用层
这一层是基于 `DomainService` 层设计的,直接面向 UI。您可以在这里自由实现任何业务逻辑。因此,此框架中没有 UI 描述。您可以选择任何您喜欢的 UI 层设计。此应用层将帮助您将业务逻辑与 UI 分离。
- 框架上下文通用
前面定义的四个部分几乎是独立的,您可以随意在项目中使用任何一个。因此,这个框架上下文通用层试图将这四个部分整合在一起。因此,在这里,定义了不同层的上下文,并使用 Spring.net AOP 集成了日志/异常处理。
到目前为止,我已从不同视图对这个框架进行了总体描述。正如我一直说的,本文旨在提供一个基本结构。还有很多需要改进的地方,包括框架和工具。将来,我将尝试进行这些改进。但希望您也能参与改进或讨论,如果您也对此框架感兴趣。
此外,我还计划写另一篇文章来详细说明如何使用该工具处理不同的数据库类型。
历史
- 版本 1.0 编辑于 2013/09/20
附注
这只是一个非常基础的版本。有关框架的任何更新,请参阅此链接。如果您在使用此示例代码或框架时有任何疑问或问题,请随时与我联系,或在此提出话题。欢迎提出任何意见。