C#中使用Microsoft Unity记录日志
作者:Darren 发布时间:2023-05-09 10:37:26
标签:C#,Microsoft,Unity,记录,日志
需要记录日志的地方包括:进入方法的时候,传参的时候,统计执行时间,方法返回参数的时候,退出语句块的时候,出现异常的时候,等等。先来体验不使用Micirosoft Unity进行日志记录。
class Program
{
static void Main(string[] args)
{
Add(1, 2);
Console.ReadKey();
}
private static int Add(int a, int b)
{
int result = 0;
string temp = string.Empty;
string returnValue = string.Empty;
try
{
//记录进入方法
Console.WriteLine("马上要执行方法了");
temp = string.Format("输入的参数为:a={0},b={1}", a, b);
Console.WriteLine(temp);
//统计方法执行时间
Stopwatch watch = new Stopwatch();
watch.Start();
result = a + b;
watch.Stop();
Console.WriteLine("程序执行时间为{0}", watch.Elapsed);
//记录返回值
returnValue = string.Format("返回结果是:{0}", result);
Console.WriteLine(returnValue);
//记录方法执行接收
Console.WriteLine("方法执行结束");
}
catch (Exception ex)
{
//记录异常
Console.WriteLine(string.Format("异常信息是:{0},输入参数是:{1}", ex.ToString(), temp));
throw;
}
finally
{
//记录异常处理
Console.WriteLine("异常已经被处理了");
}
return result;
}
}
以上,还是存在一些问题:
违反了"DRY"原则,如果还有其它方法,需要不断地写记录的逻辑
对阅读代码造成影响
耗时
Microsoft Unity的出现就是解决以上问题。
Proxy object or derived class是Unity * ,在执行方法前后进行拦截
Behaviors Pipeline是拦截行为管道,通过API注册
Target Object or Original class method是进行拦截的目标对象
引用Unity和Unity.Interception组件
输入关键字Unity,通过NuGet安装Unity。
输入关键字Unity.Interception,通过NuGet安装Unity Interception Extension。
安装完后,相关组件包括:
自定义 *
自定义的 * 必须实现IInterceptionBehavior接口。
public class MyInterceptionBehavior : IInterceptionBehavior
{
//返回拦截行为所需要的接口
public IEnumerable<Type> GetRequiredInterfaces()
{
return Type.EmptyTypes;
}
/// <summary>
/// 使用本方法实施拦截行为
/// </summary>
/// <param name="input">目标方法的参数</param>
/// <param name="getNext">在拦截管道中的拦截行为的委托</param>
/// <returns>目标方法的返回值</returns>
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Console.WriteLine("hello,方法马上开始执行~~");
IMethodReturn msg = getNext()(input, getNext);
Console.WriteLine("bye,方法执行完了");
return msg;
}
//是否启用拦截
public bool WillExecute
{
get { return true; }
}
}
定义一个计算的接口
public interface ICalculator
{
int Add(int value1, int value2);
int Subtract(int value1, int value2);
int Multiply(int value1, int value2);
int Divide(int value1, int value2);
}
对接口实现
public class Calculator : ICalculator
{
public int Add(int value1, int value2)
{
int res = value1 + value2;
Console.WriteLine(res);
return res;
}
public int Subtract(int value1, int value2)
{
int res = value1 - value2;
return res;
}
public int Multiply(int value1, int value2)
{
int res = value1 * value2;
return res;
}
public int Divide(int value1, int value2)
{
int res = value1 / value2;
return res;
}
}
配置文件中配置Unity
<configuration>
<configSections>
<section
name="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="ICalculator" type="MyLogging.ICalculator, MyLogging"/>
<alias alias="Calculator" type="MyLogging.Calculator, MyLogging"/>
<alias alias="MyBehavior" type="MyLogging.MyInterceptionBehavior, MyLogging" />
<sectionExtension
type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension,
Microsoft.Practices.Unity.Interception.Configuration" />
<container>
<extension type="Interception"/>
<register type="ICalculator" mapTo="Calculator">
<interceptor type="InterfaceInterceptor" />
<interceptionBehavior type="MyBehavior"/>
</register>
</container>
</unity>
</configuration>
以上,
通过<alias>节点为接口和类设置别名
type="MyLogging.ICalculator, MyLogging"中,逗号前面是类名,逗号后面是程序集名称
客户端调用
using System;
using System.Collections.Generic;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.InterceptionExtension;
class Program
{
static void Main(string[] args)
{
//加载UnityContainer
IUnityContainer container = new UnityContainer();
container = Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(container);
//解析出接口
ICalculator calc = Microsoft.Practices.Unity.UnityContainerExtensions.Resolve<ICalculator>(container);
//执行方法
int res = calc.Add(1, 2);
Console.ReadKey();
}
}
来源:https://www.cnblogs.com/darrenji/p/3963789.html


猜你喜欢
- protected bool IsChineseLetter(string input,int index){int code = 0;in
- Spring容器可以在不使用<constructor-arg>和<property>元素的情况下自动装配相互协作的b
- 本文主要为大家分析了图书商城的用户模块,具体内容如下1、用户模块的相关类创建domain:Userdao:UserDaoservice:Us
- 1.概述1、Spring 是轻量级的开源的 JavaEE 框架2、 Spring 可以解决企业应用开发的复杂性3、Spring 有两个核心部
- Spring Cloud Gateway(以下简称 SCG)做为网关服务,是其他各服务对外中转站,通过 SCG 进行请求转发。在请求到达真正
- 公司经理把我拉出来,死马当活马医,做一个安卓app,作为刚毕业几个月且只是培训了几个月的小白来说,这无疑是一个非常大的挑战,当然最大的挑战不
- 前言在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。集合已修
- 有很多应用场景,用到了接口动态实现,下面举几个典型的应用:1、mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编
- 本次主要分享的是3个免费的二维码接口的对接代码和测试得出的注意点及区别,有更好处理方式多多交流,相互促进进步;最近在学习JavsScript
- 前言首先,synchronized 是什么?我们需要明确的给个定义——同步锁,没错,它就是把锁。可以
- 这是一个自定义view画圆,对于初学自定义view的小伙伴这是一个很好的帮助。 看图代码:package sjx.com.custonvie
- windows xp下配置JDK环境变量:1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:/java/jdk1
- 本文实例讲述了C#简单实现防止多个程序运行的方法。分享给大家供大家参考,具体如下:/// <summary>/// 应用程序的主
- 当一个应用在后台执行时,前台界面就不会有什么信息,这时用户根本不知道程序是否在执行、执行进度如何、应用程序是否遇到错误终止等,这时需要使用进
- 可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型:Map<String, Obj
- SpringBoot 如何进行参数校验在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数做校验,例如登录的时候需要校验
- 简述Java中Socket分为普通Socket和NioSocket两种,这里介绍Socket。我们可以把Socket比作两个城市间的交通工具
- volatile对 volatile的理解volatile 是一种轻量级的同步机制。保证数据可见性不保证原子性禁止指令重排序JMMJMM(J
- 好久没有写文章了,下面把自己最近程序中用到的一个小小的导出文件的方法给在家分享一下,欢迎大家来排砖,谢谢~不说废话了,直接上代码:using
- 代码测试可用,运行结果非常辣眼睛,有种二十一世纪初流行于广大中小学生之间的失落非主流的感觉!还是比较有参考价值的,获取当前日期时间,日期类格