Microsoft.Practices.Unity 给不同的对象注入不同的Logger
场景:我们做项目的时候常常会引用第三方日志框架来帮助我们记录日志,日志组件的用途主要是审计、跟踪、和调试。就说我最常用的日志组件log4net吧,这个在.NET同行当中应该算是用得非常多的一个日志组件了。
而同时,我们又经常使用IoC技术,来降低我们项目之间、模块之间的耦合度,比如我现在在用的Microsoft.Practices.Unity(当然Autofac也是非常好用的)。
我们很清楚的知道log4net的优点,配置非常简单又非常完善,它能提供不同的日志级别、记录器、组织形式……
比如说 :
var log = LogManager.GetLogger("User");
但是当我们使用IoC注入日志记录器对象的时候,就犯难了,我想给不同的类注入不同的日志记录器,这样方便我选择性的配置哪些类、哪些级别的日志需要输出。
如:
public class UserService
{
public UserRepository Repository { get; }
public ILog Log { get; set; } public UserService(UserRepository repository,ILog log)
{
Repository = repository;
Log = log;
}
} public class UserRepository
{
public ILog Log { get; } public UserRepository(ILog log)
{
Log = log;
}
}
我想要的是给UserRepository注入 LogManager.GetLogger(typeof(UserRepository));
我想要的是给UserService注入 LogManager.GetLogger(typeof(UserService));
这样在UserRepository、UserService中写日志的时候,是分别写入不同的日志记录器,我可以很方便的控制收集哪些日志。
该怎么做呢?
找了很多资料,都没有找到Microsoft.Practices.Unity如何访问解析依赖时的上下文,我希望上下文中能找到请求ILog的对象是什么类型。
终于还是在Microsoft.Practices.Unity的源代码讨论区里面找到了解决方案,遂封装一下,简化类似操作。测试代码如下:
using NUnit.Framework;
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using log4net; namespace Microsoft.Practices.Unity.Tracking.Tests
{
[TestFixture]
public class TrackingInjectionFactoryTests
{
public IUnityContainer Container { get; set; }
[SetUp]
public void Initialize()
{
Trace.Listeners.Add(new ConsoleTraceListener());
Container = new UnityContainer();
Container.Tracking();
Container.RegisterType<UserService>();
Container.RegisterType<ILog>(new TrackingInjectionFactory((container, context, policy) => LogManager.GetLogger(policy.RequestType?.Name ?? "null")));
} [Test]
public void TrackingInjectionFactoryTest()
{
Parallel.For(, , new ParallelOptions { MaxDegreeOfParallelism = }, i =>
{
var userService = this.Container.CreateChildContainer().Resolve<UserService>();
Trace.WriteLine(userService.Log.Logger.Name, "UserService.Log.Logger.Name");
Trace.WriteLine(userService.Repository.Log.Logger.Name, "UserService.Repository.Log.Logger.Name");
});
var action = new Action(() =>
{
var log = this.Container.CreateChildContainer().Resolve<ILog>();
Trace.WriteLine(log.Logger.Name, "Logger.Name");
});
action();
var asyncResult = action.BeginInvoke(null, null);
action.EndInvoke(asyncResult);
} public class UserService
{
public UserRepository Repository { get; }
public ILog Log { get; set; } public UserService(UserRepository repository, ILog log)
{
Repository = repository;
Log = log;
}
} public class UserRepository
{
public ILog Log { get; } public UserRepository(ILog log)
{
Log = log;
}
}
}
}
源代码地址:https://github.com/echofool/Microsoft.Practices.Unity.Tracking
原谅我很懒,都不想解释太多...
Microsoft.Practices.Unity 给不同的对象注入不同的Logger的更多相关文章
- 第九回 Microsoft.Practices.Unity.Interception实现基于数据集的缓存(针对六,七,八讲的具体概念和配置的解说)
返回目录 概念 Microsoft.Practices.Unity.Interception是一个拦截器,它隶属于Microsoft.Practices.Unity组成之中,主要完成AOP的功能,而实 ...
- WPF Microsoft.Practices.Unity 注入大法简单示例
最近新入职了公司,做WPF方向的项目,进来后看到这边大量运用了依赖注入来解耦,采用的是Microsoft.Practices.Unity. WPF的话,目前主要有两个技术来实现IOC,unity和ME ...
- 使用Microsoft.Practices.Unity 依赖注入
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- 使用Microsoft.Practices.Unity 依赖注入 转载https://www.cnblogs.com/slardar1978/p/4205394.html
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
- 利用Microsoft.Practices.Unity的拦截技术,实现.NET中的AOP
1.记住这个单词的意思:Interception(拦截) 2.首先说一下原理和背景 原理:所谓的AOP就是面向切面编程,这里不多说,百度搜索. 目的:个人认为是为了解耦,部分代码跟业务代码分离,业务代 ...
- Microsoft.Practices.Unity
// // Summary: // Register a type mapping with the container. // // Parameters: // container: // Con ...
- VS - Microsoft.Practices.Unity
PM> Install-Package Unity Web.config <configSections> <section name="unity" t ...
- 20190703_创建 unity 的配置节处理程序时出错: The type name or alias Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension
创建 unity 的配置节处理程序时出错: The type name or alias Microsoft.Practices.Unity.InterceptionExtension.Configu ...
- Microsoft.Practices.Unity入门
Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入 ...
随机推荐
- Local System/Network Service/Local Service
// The name of the account under which the service should run// 1 NT AUTHORITY\\SYSTEM 2 NT AUTHORIT ...
- Windows 中默认安装的.Net 版本
Windows contains a version of .NET by default. Here's a listing of them. XP .NET v1.0 -- Service pac ...
- 用Doxygen生成文档
我是生成C/C++的文档,输出html格式的文档.就不做成CHM了. 注释要这种写:(当然,有数种注释风格,选择任意你喜欢的就行) /** * * 一系列的doxygen的 command * * * ...
- 如何打一手好Log(转)
如果项目上过线的话,那你一定知道Log是多么重要. 为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出 ...
- 【转】Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例--不错
原文网址:http://www.cnblogs.com/skywang12345/p/3311252.html 概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学 ...
- HDOJ 1070 Milk(水题,考英文的)
Problem Description Ignatius drinks milk everyday, now he is in the supermarket and he wants to choo ...
- 上海游侠电动汽车团队招募。iOS,Android,产品经理以及 SEVER 端工程师 - V2EX
上海游侠电动汽车团队招募.iOS,Android,产品经理以及 SEVER 端工程师 - V2EX 上海游侠电动汽车团队招募.iOS,Android,产品经理以及 SEVER 端工程师
- (转)三星i9500/Galaxy S4 刷基带教程
一.手机基带是什么? 三星手机的基带用通俗的话来说就是手机中的一个负责信号调节并进行传输给系统的电路设置,基带的好坏直接影响到在同等信号强度下,手机的获取信号的能力. 二.为什么要刷基带? 常说的基带 ...
- 你需要知道的九大排序算法【Python实现】之基数排序
八.基数排序 基本思想:基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sort)或bi ...
- HashMap的分析(转)
一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap ...