这是对现实世界电子商务Web应用程序项目的Aspnetrun核心基础的实现;
Aspnetruncorealworld是基础Aspnetrun项目的实现,该项目以干净的体系结构和最佳实践书写。这个想法是如何通过基本存储库来实施现实生活项目,即使用完整的电子商务网络模板实现的电子商务领域。 Aspnetrunrealworld是使用Northwind数据库的电子商务域的实现。本通过层次体系结构管理用于构建现代Web应用程序的层次架构,该应用程序使用最新的ASP.NET Core&Web API和EF Core Core Technologies进行了构建。
什么包括在此存储库中
我们已经在Run-AppNetcore样板模板上实现了以下功能。您可以将现实世界的功能作为您的业务需求更改;
- E&E电子商务主题实施
- 西北数据库的电子商务用例的全面开发
- 业务规则检查,域政策应用和验证
- 身份验证,身份模块和身份配置
- 产品页面授权
- ASP.NET核心内置依赖注入
- ASPNET核心剃须刀工具 – 查看组件,部分视图,标签助手,模型绑定和验证,剃须刀部分等。
- 配置管理
- 自定义分页实现
另外,我们还有很多缺少功能,您可以从我们的项目页面中查看此处,您可以开发它们。我们正在等待您的拉力请求。
给星星!
如果您喜欢该项目或Aspnetrun对您有所帮助,请给明星。还请提供此存储库,并向我们发送plupquequests 。如果您发现任何问题,请打开问题。
入门
使用这些说明使项目启动并运行。
先决条件
您将需要以下工具:
- Visual Studio 2019
- .NET Core 3.x或更高版本
- EF Core 3.x或更高版本
安装
请按照以下步骤设置开发环境:
- 克隆存储库
- 在根目录中,通过运行来还原所需的软件包:
dotnet restore
- 接下来,通过运行构建解决方案:
dotnet build
dotnet run
- 启动http:// localhost:5400/在您的浏览器中查看Web UI。
如果您使用IDE克隆开放解决方案后拥有Visual Studio ,则Aspnetrun.web应该是启动项目。直接使用F5或CTRL+F5在Visual Studio上直接运行该项目。您将看到项目的索引页面,可以导航产品和类别页面,并且可以在浏览器上执行CRUD操作。
用法
克隆或下载示例后,您应该能够立即使用内存数据库运行它。实体框架数据库的默认配置是“ inmemorydatabase” 。如果您希望使用持久数据库的项目使用该项目,则需要在能够运行该应用程序之前运行其实体框架核心迁移,并在startup.cs中更新configuredatabases方法(请参见下文)。
public void ConfigureDatabases ( IServiceCollection services ) { // use in-memory database services . AddDbContext < AspnetRunContext > ( c => c . UseInMemoryDatabase ( \"AspnetRunConnection\" ) . UseQueryTrackingBehavior ( QueryTrackingBehavior . NoTracking ) ) ; //// use real database //services.AddDbContext<AspnetRunContext>(c => // c.UseSqlServer(Configuration.GetConnectionString(\"AspnetRunConnection\")) // .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)); }
-
确保您在
appsettings.json中的连接字符串指向本地SQL Server实例。 -
在Web文件夹中打开命令提示符并执行以下命令:
dotnet restore dotnet ef database update - c AspnetRunContext - p .. / AspnetRun . Infrastructure / AspnetRun . Infrastructure . csproj - s AspnetRun . Web . csproj
或者,您可以从Visual Studio Package Manager Console指导呼叫EF命令。打开软件包管理器控制台,将默认项目设置为aspnetrun.infrastructure,并在命令下运行;
update - database
这些命令将创建包括产品和类别表的Aspnetrun数据库。您可以从Aspnetruncontext.cs看到。
- 运行应用程序。您第一次运行应用程序时,它将用一些数据播种Aspnetrun SQL Server数据库,以便您看到产品和类别。
如果您修改 – 更改或添加新的一些实体到核心项目,则应运行EF迁移命令,以便以相同的方式更新数据库,但下面是命令;
add migration YourCustomEntityChanges update - database
分层体系结构
Aspnetrun实现了Nlayer六边形体系结构(核心,应用程序,基础架构和演示层)和域驱动的设计(实体,存储库,域/应用程序服务,DTO …)。还实施并提供良好的基础架构来实施最佳实践,例如依赖注入,记录,验证,异常处理,本地化等。旨在成为一种干净的体系结构,也称为洋葱架构,并采用坚实的原理以用于项目模板。还实施并提供了一个良好的基础架构来实现最佳实践,例如松散耦合,依赖性与内向体系结构。下图代表了运行存储库系列的开发体系结构的Aspnetrun方法;
项目结构
存储库包括划分为4个项目的层;
- 核
- 实体
- 接口
- 规格
- ValueObjects
- 例外
- 应用
- 接口
- 服务
- DTO
- 映射器
- 例外
- 基础设施
- 数据
- 存储库
- 服务
- 迁移
- 记录
- 例外
- 网络
- 接口
- 服务
- 页面
- ViewModels
- 扩展
- 映射器
核心层
通过抽象开发域逻辑。接口将业务需求与实施相关。核心项目是干净建筑设计的中心,所有其他项目依赖性都应指向它。
实体
包括实体框架核心实体,该实体可创建使用实体框架核心代码的SQL表First abreach 。一些聚合文件夹保存实体和聚合。您可以在下面看到代码优先实体定义的示例;
public class Product : BaseEntity { public string ProductName { get ; set ; } public string QuantityPerUnit { get ; set ; } public decimal ? UnitPrice { get ; set ; } public short ? UnitsInStock { get ; set ; } public short ? UnitsOnOrder { get ; set ; } public short ? ReorderLevel { get ; set ; } public bool Discontinued { get ; set ; } public int CategoryId { get ; set ; } public Category Category { get ; set ; } public static Product Create ( int productId , int categoryId , string name , decimal ? unitPrice = null , short ? unitsInStock = null , short ? unitsOnOrder = null , short ? reorderLevel = null , bool discontinued = false ) { var product = new Product { Id = productId , CategoryId = categoryId , ProductName = name , UnitPrice = unitPrice , UnitsInStock = unitsInStock , UnitsOnOrder = unitsOnOrder , ReorderLevel = reorderLevel , Discontinued = discontinued } ; return product ; } }
应用域驱动的方法,负责创建产品实例的产品类。
接口
存储库的抽象 – 域存储库(IASYNCROSOSITOR- IPRODUCTREPOSITOR) – 规格等。此接口包含数据库操作,而没有任何应用程序和UI职责。
规格
该文件夹是实现规范模式。使用使用ISPECEFIECT接口创建自定义脚本。使用BaseSpecification管理标准,包括,订单,分页。当EF命令与传递规格一起工作时,该规格会运行。该规格已实现了规格evaluator.cs并在applyspecification方法中对aspnetrunrepository.cs创建查询。这有助于创建自定义查询。
基础架构层
该项目与实体框架核心和其他依赖关系中的核心接口实现。应用程序对外部资源的依赖大部分都应在基础架构项目中定义的类中实现。这些类必须实现核心中定义的接口。如果您有一个非常大的项目具有许多依赖项,那么拥有一个以上的基础架构项目(例如基础架构.data)可能是有意义的,但是在大多数项目中,一个包含文件夹效果很好的基础架构项目。这可以包括,例如,电子邮件提供商,文件访问,Web API客户端等。目前,此存储库仅依赖示例数据访问和基本域操作,这样就不会直接链接到您的核心或UI项目。
数据
在此文件夹中包括实体框架核心上下文和表。当创建新实体时,应添加到上下文中并在上下文中配置。基础架构项目取决于微软。 EntityFrameWorkCore.SQLServer和EF.Core相关的Nuget软件包,您可以检查基础结构层的Nuget软件包。如果要更改数据访问层,可以很容易地用像Dapper这样的较轻的ORM代替。
迁移
EF添加移民课。
存储库
EF存储库和规范实现。该类负责创建查询,包括,条件等。
服务
自定义服务实施,例如电子邮件,cron工作等。
应用层
通过实施开发域逻辑。界面可以在此层中推动业务需求和实施。应用程序层定义了用户在以下方式中所需的操作。
public interface IProductAppService { Task < IEnumerable < ProductDto > > GetProductList ( ) ; Task < ProductDto > GetProductById ( int productId ) ; Task < IEnumerable < ProductDto > > GetProductByName ( string productName ) ; Task < IEnumerable < ProductDto > > GetProductByCategory ( int categoryId ) ; Task < ProductDto > Create ( ProductDto entityDto ) ; Task Update ( ProductDto entityDto ) ; Task Delete ( ProductDto entityDto ) ; }
同样,实现同一位置,以便在DI Boottrapter时在运行时选择不同的实现。
public class ProductAppService : IProductAppService { private readonly IProductRepository _productRepository ; private readonly IAppLogger < ProductAppService > _logger ; public ProductAppService ( IProductRepository productRepository , IAppLogger < ProductAppService > logger ) { _productRepository = productRepository ?? throw new ArgumentNullException ( nameof ( productRepository ) ) ; _logger = logger ?? throw new ArgumentNullException ( nameof ( logger ) ) ; } public async Task < IEnumerable < ProductDto > > GetProductList ( ) { var productList = await _productRepository . GetProductListAsync ( ) ; var mapped = ObjectMapper . Mapper . Map < IEnumerable < ProductDto > > ( productList ) ; return mapped ; } }
在此层中,我们可以添加验证,授权,日志记录,异常处理等。-在此处应处理交叉切割活动。
Web层
通过实施开发UI逻辑。界面可以在此层中推动业务需求和实施。应用程序的主要起点是ASP.NET核心Web项目。这是一个经典的控制台应用程序,在program.cs中具有公共静态空隙主要方法。当前,它使用基于剃须刀页面模板的默认ASP.NET核心项目模板。这包括AppSettings.json文件加环境变量以存储配置参数,并在startup.cs中配置。
Web层定义用户需要在页面服务类中所需的操作;
public interface IProductPageService { Task < IEnumerable < ProductViewModel > > GetProducts ( string productName ) ; Task < ProductViewModel > GetProductById ( int productId ) ; Task < IEnumerable < ProductViewModel > > GetProductByCategory ( int categoryId ) ; Task < IEnumerable < CategoryViewModel > > GetCategories ( ) ; Task < ProductViewModel > CreateProduct ( ProductViewModel productViewModel ) ; Task UpdateProduct ( ProductViewModel productViewModel ) ; Task DeleteProduct ( ProductViewModel productViewModel ) ; }
同样,实现同一位置,以便在DI Boottrapter时在运行时选择不同的实现。
public class ProductPageService : IProductPageService { private readonly IProductAppService _productAppService ; private readonly ICategoryAppService _categoryAppService ; private readonly IMapper _mapper ; private readonly ILogger < ProductPageService > _logger ; public ProductPageService ( IProductAppService productAppService , ICategoryAppService categoryAppService , IMapper mapper , ILogger < ProductPageService > logger ) { _productAppService = productAppService ?? throw new ArgumentNullException ( nameof ( productAppService ) ) ; _categoryAppService = categoryAppService ?? throw new ArgumentNullException ( nameof ( categoryAppService ) ) ; _mapper = mapper ?? throw new ArgumentNullException ( nameof ( mapper ) ) ; _logger = logger ?? throw new ArgumentNullException ( nameof ( logger ) ) ; } public async Task < IEnumerable < ProductViewModel > > GetProducts ( string productName ) { if ( string . IsNullOrWhiteSpace ( productName ) ) { var list = await _productAppService . GetProductList ( ) ; var mapped = _mapper . Map < IEnumerable < ProductViewModel > > ( list ) ; return mapped ; } var listByName = await _productAppService . GetProductByName ( productName ) ; var mappedByName = _mapper . Map < IEnumerable < ProductViewModel > > ( listByName ) ; return mappedByName ; } }
测试层
对于每一层,都有一个测试项目,其中包括预期的层依赖项和模拟类。因此,这意味着核心应用结构和Web层具有其自己的测试层。通过这种方式,该测试项目还除以单元,功能和集成测试,这些测试由在哪个层中定义。使用Xunit和模拟库测试项目。 Xunit,因为那是ASP.NET Core内部用于测试产品的方法。欧格,因为执行清楚地创建假对象及其模块化。
技术
- .NET Core 3.x
- ASP.NET Core 3.x
- 实体框架核心3.x
- .NET核心本地DI
- 剃刀页
- 汽车应用程序
建筑学
- 干净的体系结构
- 完整的架构,负责分离关注
- 固体和干净的代码
- 域驱动设计(层和域模型)
- 工作单位
- 存储库和通用存储库
- 多页Web应用程序(MPA)
- 单层部署体系结构
- 规范模式
免责声明
- 该存储库并不是要成为确定的解决方案。
- 该存储库未实施很多第三方软件包,我们正在尽力避免在建立最佳实践时进行过度的工程。
- 当心以生产方式使用。
贡献
请阅读有关我们的行为准则的详细信息以及向我们提交拉的请求的过程的详细信息。我们有很多丢失的功能,您可以从我们的项目页面中查看此处,您可以开发它们。我们正在等待您的拉力请求。
版本控制
我们使用SEMVER进行版本控制。有关可用的版本,请参见此存储库上的标签。
接下来发行和roapmap
有关即将到来的功能和修复的信息,请查看产品路线图。
部署 – 在线aspnetrun
该项目部署在Azure上。请参阅此处在Azure上运行的项目。
拉力重quest
请为此存储库提供,然后将您的发现发送带有拉力重新要求。这是开源存储库,因此可以对贡献开放。从我们的项目页面中获取丢失功能的物品,并向我们发送您的拉请请求。
作者
- Mehmet Ozkaya-初始工作-Mehmetozkaya
另请参阅参与该项目的贡献者列表。
执照
该项目已根据MIT许可证获得许可 – 有关详细信息,请参见许可证文件。
