Net Core 大量使用依赖注入(Dependency Inject), 打个比方,我们常用的日志组件有Log4Net,NLog等等.

如果我们要随时替换日志组件,那么代码中就不能直接引用某个组件的内容,也不能直接New 某个组件.

而是应该定义一组接口, 然后包装各个组件,实现这个接口. Net Core 自带组件容器, 启动程序时,指定接口对应的实现.

然后在各个Controller 里, 通过构造函数的参数,把要带过去的接口,把容器里的对象自动传过去

在cshtml view页面,要使用@inject方法, 例如在页面使用Session,就要@inject IHttpContextAccessor _httpContextAccessor

@inject CRM.PermissionLogic  plogic
@inject IHttpContextAccessor _httpContextAccessor
@{int userid =(int)_httpContextAccessor.HttpContext.Session.GetInt32("UserId");}

如果要在静态类里使用,则要用到ServiceProvider, 在Startup.cs里注入,然后再用 serviceProvider.GetService<XXX>();

public void ConfigureServices(IServiceCollection services)
{
//注入
services.AddSingleton<IPageHeadBuilder, PageHeadBuilder>(); //解析依赖 对于一个服务A来说,它可能并不是独立的,它还在依赖服务B和服务C,而服务B又依赖服务D和服务E。。
//一个合格的容器得再我们需要服务A时,能够正确的解析这个依赖链,并按照正确的顺序实例化并返回服务A。
//ServiceProvider是ASP.NET Core团队提供的默认的依赖注入容器。
LayoutExtension.serviceProvider= services.BuildServiceProvider();
}
    public static class LayoutExtension
{
public static IServiceProvider serviceProvider { get; set; } //定义一个IServiceProvider public static IPageHeadBuilder GetService()
{
return serviceProvider.GetService<IPageHeadBuilder>();
} public static void SetActiveMenuItemSystemName(this IHtmlHelper html, string systemName)
{
var head = GetService();
head.SetActiveMenuItemSystemName(systemName);
} public static string GetActiveMenuItemSystemName(this IHtmlHelper html)
{
var head = GetService();
return head.GetActiveMenuItemSystemName();
}
}

各个页面/Controller ,再调用接口的方法. 所谓的面向接口编程.

Net Core 在Microsoft.Extension.Logging定义了ILogger,ILoggerFactory,ILoggerProvider 这几个接口, 日志组件实现这个接口就可以被调用了.

上网查了一下,NLog已经实现了这些接口了,你用Nuget找NLog.Web.AspNetCore 就已经包装好了. 具体文档,请看这篇文章,非常详细.

https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

我们来看一下代码, 要调用NLog, 在Program.cs里

        public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConsole();
logging.AddDebug();
})
.UseNLog()
.Build();
}

调用NLog写Log,   在构造函数里增加参数,类型是接口,不能是实现类

using Microsoft.Extensions.Logging;    

public class HelloMiddleware
{
private readonly ILogger<HelloMiddleware> _logger;
private readonly RequestDelegate _next; public HelloMiddleware(RequestDelegate next,ILogger<HelloMiddleware> logger)
{
_next = next;
_logger = logger;
} public Task Invoke(HttpContext httpContext)
{
httpContext.Response.WriteAsync("Hello in Class Invoke"+ Environment.NewLine);
_logger.LogInformation("******hello middleware*********");
return _next(httpContext);
}
}

MVC的controller写法也类似

        private readonly CRMContext _context;
private readonly IConfiguration _config;
private readonly ILogger<AccountController> _logger; public AccountController(CRMContext context
IConfiguration configuration,ILogger<AccountController> logger)
{
_context = context;
_config = configuration;
_logger = logger;
}

我们也可以把常用的注入(例如数据库 CRMContext context ) 放在基类BaseController, 子类的构造函数继承基类的构造函数

        private readonly IConfiguration _config;
private readonly ILogger<AccountController> _logger; public AccountController(
IConfiguration configuration,ILogger<AccountController> logger):base(context)
{ _config = configuration;
_logger = logger;
}
 public abstract class BaseController : Controller
{
protected readonly CRMContext _context; public BaseController(CRMContext context)
{
_context = context;
}
}

我们来看看UseNLog()这个方法的代码,看看做了什么

        /// <summary>
/// Use NLog for Dependency Injected loggers.
/// </summary>
public static IWebHostBuilder UseNLog(this IWebHostBuilder builder)
{
return UseNLog(builder, null);
} /// <summary>
/// Use NLog for Dependency Injected loggers.
/// </summary>
/// <param name="builder"></param>
/// <param name="options">Options for logging to NLog with Dependency Injected loggers</param>
/// <returns></returns>
public static IWebHostBuilder UseNLog(this IWebHostBuilder builder, NLogAspNetCoreOptions options)
{
if (builder == null) throw new ArgumentNullException(nameof(builder));
options = options ?? NLogAspNetCoreOptions.Default; builder.ConfigureServices(services =>
{
//note: when registering ILoggerFactory, all non NLog stuff and stuff before this will be removed
services.AddSingleton<ILoggerProvider>(serviceProvider =>
{
ServiceLocator.ServiceProvider = serviceProvider;
return new NLogLoggerProvider(options);
}); //note: this one is called before services.AddSingleton<ILoggerFactory>
if (options.RegisterHttpContextAccessor)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
} RegisterHiddenAssembliesForCallSite();
});
return builder;
}

而Log4Net 就没有官方的包装,只有一个第三方包装的, 但包装的不好, 日志的配置不是放在Program.cs, 而是放在StartUp.cs. 我打算有时间再重新包装一次.

参考这篇文章

http://www.cnblogs.com/drivenwinder/p/8300881.html

把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog的更多相关文章

  1. 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...

  2. 把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析

    因为自己到开发电脑转到Mac Air,之前的Webform/MVC应用在Mac 跑不起来,而且.Net Core 2.0 已经比较稳定了. 1. 为什么会有跨平台的.Net Core  近年来,我们已 ...

  3. 把旧系统迁移到.Net Core 2.0 日记 (12) --发布遇到的问题

    1. 开发时是在Mac+MySql, 尝试发布时是在SQL2005+Win 2008 (第一版) 在Startup.cs里,数据库连接要改,分页时netcore默认是用offset关键字分页, 如果用 ...

  4. 把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql

    因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql 数据库迁移时,nvarc ...

  5. 把旧系统迁移到.Net Core 2.0 日记(3) - 详解依赖注入 (转)

    关于DI 依赖注入, 转载这篇文章, 写得很好的. ----------------------------- DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关 ...

  6. 把旧系统迁移到.Net Core 2.0 日记 (17) --多租户和SoftDelete

    在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilter,它出现的意义在哪里?能够解决什么问题呢? 通过HasQueryFilter方法来创建过滤器能够允许我们对访问特定数据库 ...

  7. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

  8. 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  9. 把旧系统迁移到.Net Core 2.0 日记(8) - EASYUI datagrid+ Dapper+ 导出Excel

    迁移也没太大变化,有一个, 之前的Request.QueryString 是返回NameValueCollection, 现在则是返回整个字符串. 你要改成Request.Query[“key”] 直 ...

随机推荐

  1. 初步接触ES6

    Babel---ES6转码器 ES6 声明变量的六种方法 ES5 只有两种声明变量的方法:var命令和function命令. ES6除了添加let和const命令,另外两种声明变量的方法:import ...

  2. mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容

    有两个地方需要配置: 1.web.config中的节点: <system.webServer> <validation validateIntegratedModeConfigura ...

  3. Web阶段总结以及感受(附带大一结束暑期学习的纲要)

    之前本人大一因为不是计算机专业的,而又喜欢计算机,所以在大一临时转专业到了计算机院(费劲一番波折),冷笑,还好,从大二开始就可以正式学习喜欢的软件了. 首先,前两天看到一个讲座,提到学习方法,并说出总 ...

  4. MySql连接时出现1251 client does no support authentic错误解决方法

    使用Navicat Premium软件连接时,报错: 解决方法: 修改配置项:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password B ...

  5. Boostrap导航栏跳转到其他页面或外部链接

    想要在boostrap下增加一个标签a,并设置其href属性来实现跳转功能(具体是想在导航栏中添加,点击某个导航栏部件时跳转至其他页面),但是发现事情并不是想象中的那么简单: “Bootstrap为这 ...

  6. 力扣(LeetCode)67. 二进制求和

    给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: ...

  7. leecode第一百四十一题(环形链表)

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  8. 【C#】 基于ArcFace 2.0—视频人脸识别Demo

    使用的虹软人脸识别技术 啥话不说,不用跪求,直接给下载地址:http://common.tenzont.com/comdll/arcface2demo.zip(话说附件的大小不限制,还是说我的文件太大 ...

  9. Racadm设置idrac

    参考文档  idrac7-8-lifecycle-controller-v2.40.40.40_Reference Guide_en-us 0.下文中账户名密码均省略-r <RAC IP add ...

  10. PHP添加Memcached扩展

    1.下载memcached扩展 https://pecl.php.net/package/memcache 2.tar -xzvf memcache-2.2.7.tgz    #解压memcached ...