本文以 ASP.NET Web API 为后台框架,利用 EF6 连接 postgreSQL 数据库,使用 swagger 来生成 REST APIs文档。文章分二个部分,第一部分主要讲如何用 EF6 连接 postgreSQL,第二部分是介绍如何集成 swagger,如何屏蔽 swagger 默认自带的接口说明。

 

一、EF6 连接 postgreSQL 

(1)使用 NuGet 安装 Npgsql.EntityFramework

在VS的程序包管理控制台输入如下命令

Install-Package Npgsql.EntityFramework

(2)配置 Web.config

利用 NuGet 安装的 EntityFramework,大部分配置都会自动在 Web.config 中生成,但却不会生成 DbProviderFactories,咱们手动把 DbProviderFactories 加上。数据库的连接信息也需要手动配置,在这里一并配置。配置如下:

 1 <system.data>
 2     <DbProviderFactories>
 3         <remove invariant="Npgsql" />
 4         <add name="Npgsql" invariant="Npgsql" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
 5     </DbProviderFactories>
 6 </system.data>
 7 <connectionStrings>
 8     <!--  数据库连接字符串, 包含主机,端口,用户,密码 -->
 9     <add name="DbConn" connectionString="Server=localhost;Port=5432;User Id=postgres; Password = postgres; Database=postgres" providerName="Npgsql"/>
10 </connectionStrings>

(3)新建 数据库上下文(DbContext)类

 1 // 数据库上下文 DB.cs
 2 public class DB : DbContext
 3 {
 4     public DB() : base("name = DbConn") {}
 5     protected override void OnModelCreating(DbModelBuilder modelBuilder)
 6     {
 7         //设置 EF 的默认schema
 8         modelBuilder.HasDefaultSchema("public");
 9     }
10     // 实体类 (demo为表名)
11     public virtual DbSet<demo> demo { get; set; }
12 }

(4)新建实体类 demo

1 public class demo
2 {
3     [Key]
4     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
5     public string id { get; set; }
6 
7     [Required]
8     public string name { get; set; }
9 }

(5)改写 ValuesController

1 public List<demo> Get()
2 {
3     using (DB db = new DB())
4     {
5         return db.demo.ToList();
6     }
7 }

(7)测试数据连接是否正常

浏览器中输入 http://localhost:46665/api/Values,如果能看到有数据库中的数据返回,表示数据访问正常。

 

二、集成 swagger

 (1)安装  swagger

Install-Package Swashbuckle

(2)配置 xml 生成 路径

选中项目—>右键—>项目属性—>生成—>勾选(XML文档文件)—>保存

(3)查看结果 

   浏览器中输入 http://localhost:46665/swagger/ui/index

   PS:运行中如果出现错误,找到 SwaggerNet 类,注释类上面的两行       

// [assembly: WebActivator.PreApplicationStartMethod(typeof(webApi.App_Start.SwaggerNet), "PreStart")]
// [assembly: WebActivator.PostApplicationStartMethod(typeof(webApi.App_Start.SwaggerNet), "PostStart")]    

(4)swagger 中显示接口注释信息

 1 public class SwaggerConfig
 2 {
 3     public static void Register()
 4     {
 5         var thisAssembly = typeof(SwaggerConfig).Assembly;
 6 
 7         GlobalConfiguration.Configuration 
 8             .EnableSwagger(c =>{
 9                                c.SingleApiVersion("v1", "webApi");
10                                //添加XML解析
11                                //注意修改相应的XML名字
12                                c.IncludeXmlComments(string.Format("{0}/bin/webApi.XML", System.AppDomain.CurrentDomain.BaseDirectory));
13              }).EnableSwaggerUi(c =>{});
14     }
15 }

 

到此,swagger 已经能生成文档了,但这时候生成的文档中会包含 swagger 默认自带的接口,看起来有点别扭。下面介绍下屏蔽 swagger 默认自带的接口。

在 SwaggerConfig 中添加 DocumentFilter。

 

 1 public class SwaggerConfig
 2 {
 3     public static void Register()
 4     {
 5         var thisAssembly = typeof(SwaggerConfig).Assembly;
 6 
 7         GlobalConfiguration.Configuration 
 8             .EnableSwagger(c =>{
 9                                c.SingleApiVersion("v1", "webApi");
10                                //添加XML解析
11                                //注意修改相应的XML名字
12                                c.IncludeXmlComments(string.Format("{0}/bin/webApi.XML", System.AppDomain.CurrentDomain.BaseDirectory));
13                                // 接口过滤
14                                c.DocumentFilter<ApiFilter>();
15              }).EnableSwaggerUi(c =>{});
16     }
17 }
 1 // ApiFilter.cs
 2 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]   
 3 public partial class ApiAttribute : Attribute { }
 4 public class ApiFilter: IDocumentFilter
 5 {
 6     public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
 7     {
 8          foreach (ApiDescription apiDescription in apiExplorer.ApiDescriptions)
 9          {        
10             // url 过滤
11             var _key = "/" + apiDescription.RelativePath.TrimEnd('/');
12             if (_key.Contains("/api/Swagger") && swaggerDoc.paths.ContainsKey(_key))
13                swaggerDoc.paths.Remove(_key);
14           }
15     }
16 }

重新运行下,swagger 默认自带的接口已经不见了。

分类:

技术点:

相关文章: