Log4Net的使用的问题

在一个项目当中使用了log4net和Quartz,结果使用ILog.Info等方法死活无法输出日志信息, 结果一看在Quartz当中使用了Common.Logging库的,而这个库也有一个ILog接口。 原因是由于使用的智能修复,默认给我引用了Common.Logging库的ILog接口,之后改为log4net的,一切正常。 log4Net使用 首先在NuGet当中引入log4net的包。 之后你需要在你的App.Config或者Web.Config当中配置你的log4net的设置。 举个栗子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?xml version="1.0" encoding="utf-8"?> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections> <configSections> <log4net> <root> <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录--> <!--如果没有定义LEVEL的值,则缺省为DEBUG--> <level value="INFO" /> <appender-ref ref="RollingFileAppender" /> </root> <appender name="RollingFileAppender" type="log4net.

C# 函数式编程:部分应用与局部套用

什么是局部套用? 局部套用可以将需要接收多个参数的函数转化为一个函数链,在这个函数链的末尾,所有的参数都可以使用。 如何在C#当中实现局部套用 我们有一个函数如下: 1 2 3 4 5 6 7 8 9 10 public int Test(int value,int value2) { return value * value2; } public void call() { Func<int,int,int> a = Test; int _result = a(10,20); } 它的局部套用函数如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 public Func<int,int> Test2(int par2) { return par1=>par1*par2; } public void call2() { Func<int,Func<int,int>> a = Test2; var _func1 = a(10); int _result = _func1(20); // or a(10)(20); } 我们可以建立一个扩展函数来直接将一个正常函数转换为一个局部套用函数:

.NET Core 与 .NET Framework 动态加载DLL的一些不同点

在.NetCore实现插件系统的时候,发现某些方法与在.NetFramework内的使用方法不一样,在此做一个记录供以后查阅。 NO.1 Assembly.Load 与 AssemblyLoadContext.Default.LoadFromXXX 在.NetFramework当中,如果要加载某一个程序集的话,通过Assembly的Load的各种重载方法即可通过文件流、文件路 径等方式将其加载到当前调用方的应用程序域当中。但是在.Net Core当中则不然,它并没有在Assembly当中提供Load 方法供开发人员操作,而你则需要在Nuget里面对当前项目安装System.Runtime.Loader,然后使用其提供的 AssemblyLoadContext来进行程序集加载。 引用自OSChina的一篇资讯: App Domain App Domain在CoreCLR中得以实现,但没有在.NET Native中实现。由于对App Domain的实现需要大量的运行时特性支持,因此目前还没有任何对它的支持计划。“对于代码的隔离,我们建议通过进程或容器实现。而对于程序集的动态加 载,我们建议使用新的AssemblyLoadContext类。” 例如以下代码: 1 2 3 4 5 6 7 8 9 10 // .NetFramework public void assemblyTestMethod() { var _asm = Assembly.Load("C:\Test.dll"); } // .Net Core public void assemblyTestMethodCore() { var _asm = AssemblyLoadContext.Default.LoadFromAssemblyPath("C:\Test.dll"); } NO.2 GetCustomAttribute() 扩展支持 在.NetFramework当中,GetCustomAttribute()方法是针对Type与TypeInfo对象的,但是在.NetCore当中如果要调用这个 方法的话,则仅能通过Type.GetTypeInfo().GetCustomAttribute()来获得对象的特性标签。 NO.3 GetInterface与GetInterfaces方法 貌似在.NetCore当中的Type对象是没有Getinterface方法的,So…你只有使用后者获得一个IEnumerable对象再来筛选啦。

将指定实体序列化为 XML 文档

在使用Json.Net的时候,如果要生成一个JSON文档的话,只需要构建一个实体,并扔进SerializeObject方法即可。 那么如果我们需要将一个实体序列化为XML呢? 这个时候我们就需要使用到XMLSerializer,根据MSDN的介绍 XML 序列化是将对象的公共属性 (Property) 和字段转换为序列格式(这里是指 XML)以便存储或传输的过程。 这里他会将我们的公共属性转化为序列格式,下面我们来声明一个实体模型: 1 2 3 4 5 6 7 8 [XmlRoot(ElementName = "Student")] public class StudentModel { [XmlElement("StudentName")] public string Name { get; set; } [XmlElement("StudentAge")] public int Age{ get; set; } } 这里的XmlRoot与XmlElement分别是对根元素名称与其序列化的XML元素节点的实际名称。 因为在与第三方系统对接的时候,可能对方提供的一些文档与己方模型属性名称不匹配,而又不想因为第三方系统的对接而重构自己所有原有属性的名称,这个时候这两个Attribute就能够提供作用了。 下面我们如果要将这个对象序列化,需要写一个辅助方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 public static string SerializeXMLObject<T>(T sourceObj) { XMLSerializer _serializer = new XMLSerializer _serializer(typeof(T)); using(MemoryStream _stream = new MemoryStream()) { _serializer.

Autofac 注入单个类型引发的BUG

在Register当中有以下代码: 1 2 3 4 5 6 7 8 9 10 private void Register() { ... _builer.RegisterType<BaseConnectionFactory>().As<IBaseConnectionFactory>().InstancePerLifetimeScope(); ... } publi abstrct class BaseConnectionFactory { //...other code... } 注册之后提示异常信息: 1 Autofac.Core.DependencyResolutionException:“No constructors on type 'PDL.DoubleCenter.Infrastructure.BaseConnectionFactory' can be found with the constructor finder 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'.” 之后查阅相关资料无果,之后尝试将abstrct取消之后正常注册。
Built with Hugo
主题 StackJimmy 设计