Fluent Nhibernate 是一款用于简化 NHibernate 配置的工具,它通过提供一个更加直观和可读的 Fluent API 来替代传统的 XML 配置文件。在这个三层小实例中,我们将探讨如何利用 Fluent Nhibernate 实现数据访问层(DAL)、业务逻辑层(BLL)和用户界面层(UI)的架构设计。
1. 数据访问层(DAL):在这一层,我们主要处理与数据库的交互。Fluent Nhibernate 提供了强大的映射能力,将数据库表映射到 C# 类型。我们需要定义实体类,这些类代表数据库中的表。然后,使用 Fluent Nhibernate 的 Mapping 序列,我们可以创建映射规则,如表名、主键、字段映射等。例如,如果我们有一个 `User` 实体,可以这样映射:
```csharp
public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("Users");
Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Name);
Map(x => x.Email);
}
}
```
2. 业务逻辑层(BLL):这一层主要封装了应用程序的业务规则和操作。BLL 类通常会调用 DAL 提供的方法来执行数据操作,并对数据进行验证和处理。例如,创建一个用户的服务:
```csharp
public class UserService
{
private readonly IUnitOfWork _unitOfWork;
public UserService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public void CreateUser(User user)
{
// 验证用户数据,执行业务规则
if (string.IsNullOrEmpty(user.Name))
throw new ArgumentException("Name is required.");
// 使用 DAL 创建用户
var userRepository = _unitOfWork.GetRepository<User>();
userRepository.Insert(user);
// 提交事务
_unitOfWork.Commit();
}
}
```
3. 用户界面层(UI):这一层通常是 Web 应用的前端部分,可以是 ASP.NET MVC、ASP.NET Core MVC 或其他技术。UI 层接收用户的输入,调用 BLL 进行处理,并返回结果给用户。例如,一个简单的 MVC 控制器:
```csharp
public class UserController : Controller
{
private readonly UserService _userService;
public UserController(UserService userService)
{
_userService = userService;
}
[HttpPost]
public ActionResult CreateUser(User user)
{
try
{
_userService.CreateUser(user);
return RedirectToAction("Index", "Home");
}
catch (ArgumentException ex)
{
ModelState.AddModelError("", ex.Message);
return View(user);
}
}
}
```
4. UnitOfWork 模式:在上述示例中,我们提到了 `IUnitOfWork` 接口,这是对数据库事务的一种抽象。在实际应用中,我们可以使用这个接口来管理数据库事务,确保数据一致性。例如,当 BLL 方法执行时,所有数据库操作都在一个事务内完成,如果发生错误,事务将被回滚。
5. Repository 模式:DAL 中的 Repository 是对数据库访问的抽象,它封装了与数据库相关的查询、增删改查等操作。Repository 通常由 Fluent Nhibernate 的 Session 对象提供,允许我们在 BLL 中无需直接引用 NHibernate,从而实现更佳的解耦。
6. 配置和初始化:在项目启动时,我们需要配置 Fluent Nhibernate 和 NHibernate,包括数据库连接字符串、映射文件等。这通常在全局.asax 或配置服务容器时完成。
通过这个三层架构小实例,我们可以看到 Fluent Nhibernate 如何简化数据访问层的开发,同时保持业务逻辑和用户界面的清晰分离。这样的设计有助于项目的扩展和维护,使得代码更加模块化和易于测试。