博客四元素

既然要写一个博客类的网站,那就应该知道博客的相关信息。

标题 作者 时间 内容
title author time content

因为之前有了解过Redis,所以有点纠结于数据的存储方式,最终决定还是按照书上写的一步一步来,搞完了之后再决定是不是需要做修改。

书中介绍的存储方式如下:

post:count title 小猿的博客
author 小猿
time 2018.5.17
content 世界如此美妙,我却选择的程序员

看的出来博客的所有内容都是以HashSet形式存储的(目前状态),保证存储内容的唯一性取决于post:count的count,这个count应该类似于自增变量。

  1. 既然是面向对象编程,第一件事肯定是创建一个实体类;

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Blog.Common; namespace Blog.Models
    {
    public class BLogModel
    {
    public BLogModel(string title, string author, DateTime time, string content)
    {
    bool flag = true;
    if (!title.IsNullOrEmpty())
    this.title = title;
    else
    flag = false; if (!author.IsNullOrEmpty())
    this.author = author;
    else
    flag = false; if (time == null)
    flag = false;
    else
    this.time = time; if (!content.IsNullOrEmpty())
    this.content = content;
    else
    flag = false; if(flag==false)
    {
    throw new ApplicationException("创建BLogModel实体有必填字段为空");
    }
    }
    public string title { get; set; } public string author { get; set; } public DateTime time { get; set; } public string content { get; set; }
    }
    }

    创建这个实体类,我住了定义字段之外主要做了两件事。

    ①由于在我的SDK里没有找到判空的方法,所以给string写一个扩展方法IsNullOrEmpty;

    ②每一个博客对象都应该是完整的即每个字段都是必填项,因为使用的是Redis存储也就只能在C#中判断必填项了;

    这里还说到另外一个问题,通常情况下需要建立文章缩略名称和文章ID的关联关系。这样做的目的是为了确保文章的唯一性和符合网站网址规范上的一些操作。但是现在还不打算启用这一操作。

  2. 纠结的入库方式

    本来我想的是在控制器中获得数据然后调用RedisCommon的方法获取一个连接对象添加一下就行了,但是代码写了很长一行才搞定exist的判断,有点忍不了。还是决定把所有数据都扔给RedisCommon类叫他来完成这件事情。

    首先一打开这个类我就决定先写一个扩展方法(我可能最近比较迷恋写扩展),和之前的ToDic正好相反,这次是把Dictionary<string,string>转化为HashEntry[]

     public static HashEntry[] ToHashEntry(this Dictionary<string, string> dic)
    {
    List<HashEntry> list = new List<HashEntry>();
    foreach (var item in dic.Keys)
    {
    list.Add(new HashEntry(item, dic[item]));
    } return list.ToArray();
    }

    写这个方法的目的是感觉以后会有很多的字典转成HashEntry数组的情况,使用起来可能比较方便,然后就可以开心的写入库方法了。

     public static void SetBLog(BLogModel bLog)
    {
    string postCount = GetData().StringIncrement("post:count").ToString();
    Dictionary<string, string> dic = new Dictionary<string, string>();
    dic.Add("title", bLog.title);
    dic.Add("author", bLog.author);
    dic.Add("time", bLog.time.ToString());
    dic.Add("content", bLog.content); try
    {
    GetData().HashSet("post:"+postCount, dic.ToHashEntry());
    }
    catch (Exception e)
    {
    throw e;
    }
    }

    虽然还不想使用缩略名称和ID关联关系的这个功能,但还是写上吧,省的以后费事。

     public static bool SetSlugToId(string slug, string id)
    {
    if (!GetData().HashExists("slug.to.id", slug))
    {
    GetData().HashSet("slug.to.id", slug, id);
    return true;
    }
    return false;
    }
  3. 集成log4net

    log4net就很熟悉了,虽然可以把各种日志都打到数据库中,但是感觉最实用的还是日志文件。

    所以起手式还是dotnet cli命令dotnet add package log4net

    这里提一下,准备以后有时间了解一下bower,如果可以搞定的话,就玩一下。

    然后操作步骤如下文

    • 创建一个文件,起名叫log4net.config。
    • 在项目起始方法中加载log4net。
    • 创建一个全局异常类,其实可以不用这个类的,但是感觉还不错就加进来了。

    log4net.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <!-- This section contains the log4net configuration settings -->
    <log4net> <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 - %message%newline" />
    </layout>
    </appender> <!-- Setup the root category, add the appenders and set the default level -->
    <root>
    <level value="ALL" />
    <appender-ref ref="RollingLogFileAppender" />
    </root> </log4net>
    </configuration>

    在Startup文件中加载log4net,其实比原来就多加了三行代码。

    这里需要说的就是创建静态ILoggerRepository的时候需要导包,最机智的方法自然就是dotnet new sln创建一个解决方案,把项目填进去,用VS解决这件事。

      public static ILoggerRepository repository{get;set;}
    public Startup(IConfiguration configuration)
    {
    Configuration = configuration; //加载log4net日志配置文件
    repository = LogManager.CreateRepository("NETCoreRepository");
    XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
    }

    全局异常类

    using log4net;
    using Microsoft.AspNetCore.Mvc.Filters;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks; namespace Blog
    {
    public class HttpGlobalExceptionFilter : IExceptionFilter
    {
    private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HttpGlobalExceptionFilter));
    public void OnException(ExceptionContext context)
    {
    log.Error(context.Exception);
    }
    }
    }

    log的使用方式,一般情况下吧log对象放在基类中就够用了。

     protected static ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(HttpGlobalExceptionFilter));
    
     log.Info("log test fisish");

Asp.net MVC + Redis(hash入库+log4net集成)的更多相关文章

  1. ASP.NET MVC & Web API项目中集成MEF

    1.实现方式 //WebApi需要实现的接口 System.Web.Http.Dependencies.IDependencyResolver //MVC需要实现的接口 System.Web.Mvc. ...

  2. Asp.net MVC + Redis(Linux安装Redis)

    最近有幸在工作中用到了redis,玩的还算开心.但是发现Redis在Windows上并不是满血状态的,所以决定安装一个Linux的虚拟机,让Redis在Linux上运行. 虚拟环境 虚拟机,我已经玩了 ...

  3. MVC + Redis

    net MVC + Redis(hash入库+log4net集成) https://www.cnblogs.com/hoyu/p/9063675.html 博客四元素 既然要写一个博客类的网站,那就应 ...

  4. Log4net入门(ASP.NET MVC 5篇)

    在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中. 一.创建最简单的AS ...

  5. 在ASP.NET MVC中使用Log4Net记录异常日志,出错时导向到静态页

    本篇体验在ASP.NET MVC 4中使用Log4Net记录日志. 通过NuGet安装Log4Net. 需求是:当出错时导向到Error.html静态页面,Log4Net记录错误信息. 大致的思路是: ...

  6. ASP.NET MVC 5 SmartCode Scaffolding for Visual Studio.Net

    介绍 ASP.NET MVC 5 SmartCode Scaffolding是集成在Visual Studio.Net开发工具中一个ASP.NET MVC Web应用程序代码生成框架,使用SmartC ...

  7. 在ASP.NET MVC中使用Redis

    一.Redis基本认知 1.含义: REmote DIctionary Server(Redis) | 是一个key-value存储系统 2.特性: 2.1 持久化:可以将内存中的数据保存在磁盘中,重 ...

  8. ASP.NET MVC+Redis (准备工作)

    今天准备更新这个项目的第二篇博客.有一点需要说明的是之前觉得用的是Asp.net的WebPage,经过查看微软的官方文档还有相关的博客,相比较而言使用起来需要安装一个自动工具WebMatrix可以很快 ...

  9. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

随机推荐

  1. 关于NSKeyedArchiver的编码格式

    NSKeyedArchiver在linux的实现默认的格式是二进制: NSArray *ary = @[@"hello",@"world",@"!!! ...

  2. Mybatis #和$

    在mybatis的mapper文件中,对于传递的参数我们一般是使用#和$来获取参数值. 当使用#时变量是占位符,就是一般我们使用java jdbc的PrepareStatement时的占位符?,所有可 ...

  3. 遗传算法解决TSP问题实现以及与最小生成树的对比

    摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...

  4. mac OS X 10.10更新gcc 4.9.1后默认无法编译连接的问题

    MAC OS X10.10升级前使用的低版本的gcc(好像是4.7.x),正常编译可以完成,不过会出现警告: couldn't understand kern.osversion `14.0.0' 网 ...

  5. Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能

    博客描述:后台返回地点的经纬度在地图上进行描点,点击导航弹出PopupWindow进行选择地图操作,如果手机中没有安装地图,提示没有,否则传值调起地图进行导航操作 看一下实现的效果,没图说再多都白搭 ...

  6. HTML 5核心内容

    demo飞象 HTML 5 系列文章索引:http://www.cnblogs.com/webabcd/archive/2012/05/27/2520567.html demo飞象HTML 5 (11 ...

  7. Gradle初探

    (一):创建一个Gradle项目 1. 环境准备 1.1. 先上Gradle官网下载最新版的程序,地址:https://gradle.org/gradle-download/. 1.2. 配置环境变量 ...

  8. 登录以及发送微信消息itchat 库

    项目地址点这里 itchat   itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单. 使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人. 当然,该api的 ...

  9. linux 下查看wwn号

    PC server主机与FC存储进行连接时,一般需要加装HBA卡,两者之间衔接的一个重要参数就是wwn号.redhat或suse下查看wwn号的方法如下.一.SuSE Linux 9查看 /proc/ ...

  10. python 定时服务模块

    python定时任务使用方法如下: import sched shelder = sched.scheduler(time.time, time.sleep) shelder.enter(2, 0, ...