[.net core]搭建asp.net core api+ef core+log4net+ioc+单元测试项目与iis部署
2021-07-03 19:10
标签:ftp return oge sql builder environ 包管理 mic etc 该项目的目录结构:
CustomModel:自定义模型,用于与界面交互的数据模型。 Model:数据库映射层,EF数据模型与数据库上下文。 IService与Service:业务逻辑层。 CrmApi:API的实现。 CrmApi.Test:API的单元测试。 数据库映射层: 首先在NuGet包管理器->程序包管理器控制台中安装Entity Framework Core的依赖项: 生成 EF 数据模型与数据库上下文: 如果DbContext中包含数据库中所有的表,那么用第一个构造函数即可,如果多张表分布在不同的 DbContext中,就需要使用第二构造函数,这种情况下需要传递多个DbContext应用到一个连接。 EF Core数据库连接地址:
业务逻辑层: 使用DI设计思想,首先创建一个ServiceBase类,所有的接口实现类必须继承这个类,准备需要注入的依赖参数:
接口类:
接口实现类:
API层: 这里选择Unity类库作为IOC容器,在NuGet中安装Unity包,新建IocHelper类:
在Api的在Startup构造方法中使用Ioc注册接口:
在Controller中获取注册的接口服务:
请求UserController的GetUserInfo方法输出结果:
项目单元测试:
IntiTest方法中注册接口以及初始化Controller。 在asp.net core api中配置log4net: 在NuGet中添加log4net类库。
在项目中添加log4net.config文件。 在Startup构造方法中初始化log4net。 然后控制器中获取对象使用。 测试输出结果:
我们正常运行api进行测试是没有问题的,但在做单元测试时会发生报错,原因是我们在单元测试的初始方法中new了Controller,这时候会执行LogManager.GetLogger方法,而由于直接new的Controller所以并没有经过Startup的构造方法没有对log4net进行初始化,才导致报错。所以我们也要将Ilog的接口装载到ioc容器中,然后给容器自动创建接口: 在IocHelper类中加入方法: 在Startup类的构造方法中将log4net注册到ioc容器中:
在Controller中根据name获取ILog服务:
在单元测试初始方法中始化log4net:
同样在单元测试的项目中也要添加log4net.config配置文件。 这样调试测试单元测试时可以正常运行,日志也正常输出。 在 IIS 中部署 .NET Core API 站点: 确认IIS主页->模块中存在AspNetCoreModule模块,AspNetCoreModule是允许ASP.NET核心应用程序在反向代理配置中在IIS后面运行。
.NET Core应用程序与经典.NET应用程序完全不同,它并不是运行在IIS的工作进程中,而是独立运行的。它独立运行在控制台应用程序中,并通过.NET运行时命令调用。它并没有被加载到IIS工作进程中,但是IIS却加载了名为AspNetCoreModule的本地模块。下图说明了 IIS,AspNetCoreModule 模块与应用程序之间的关系:
官方AspNetCoreModule说明:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/aspnet-core-module?view=aspnetcore-2.1 在VS中发布.NET Core应用程序,选择IIS、FTP等:
然后选择文件系统。
设置目标框架等。
然后在 IIS 中添加一个应用程序池,.NET CLR 版本选择无托管代码。
剩下的与经典ASP.NET应用程序部署的步骤一致,选择新添加的应用程序池即可。 官方ASP.NET Core的IIS托管部署说明:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/index?view=aspnetcore-2.1 [.net core]搭建asp.net core api+ef core+log4net+ioc+单元测试项目与iis部署 标签:ftp return oge sql builder environ 包管理 mic etc 原文地址:https://www.cnblogs.com/huayueniansi/p/9872377.htmlInstall-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Relational
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
Scaffold-DbContext "Server=.;Database=SaierDb;User ID=sa;Password=123;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
///
xml version="1.0" encoding="utf-8"?>
configuration>
log4net>
appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
appender>
appender name="FileAppender" type="log4net.Appender.FileAppender">
file value="log-file.log" />
appendToFile value="true" />
layout type="log4net.Layout.PatternLayout">
conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
layout>
appender>
appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
file value="logfile/" />
appendToFile value="true" />
rollingStyle value="Composite" />
staticLogFileName value="false" />
datePattern value="yyyyMMdd‘.log‘" />
maxSizeRollBackups value="10" />
maximumFileSize value="1MB" />
layout type="log4net.Layout.PatternLayout">
conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
layout>
appender>
root>
level value="ALL" />
appender-ref ref="ConsoleAppender" />
appender-ref ref="FileAppender" />
appender-ref ref="RollingLogFileAppender" />
root>
log4net>
configuration>
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
Repository = LogManager.CreateRepository("NETCoreRepository");
XmlConfigurator.Configure(Repository, new FileInfo("log4net.config"));
}
public static ILoggerRepository Repository { get; private set; }
private readonly ILog _log = LogManager.GetLogger(Startup.Repository.Name, typeof(UserController));
//_log.Info("test");
//_log.Error(ex.Message, ex);
///
文章标题:[.net core]搭建asp.net core api+ef core+log4net+ioc+单元测试项目与iis部署
文章链接:http://soscw.com/index.php/essay/101397.html