zoukankan      html  css  js  c++  java
  • Orchard 源码探索(Log)

    • 简单工厂模式、抽象工厂模式和适配器模式

    依赖倒置原则也叫依赖倒转原则,Dependence Inversion Principle,对抽象进行编程,不要对实现进行编程。
    A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
    B.抽象不应该依赖于具体,具体应该依赖于抽象。

    面相对象设计将就高内聚、低耦合,高内聚指功能相关性很强的紧密的结合在一起,遵守单一职责原则;耦合是指不同模块或不同层次代码的联系程度,耦合性越低,模块独立性越强,耦合性越高,模块独立性越弱,高耦合的软件,往往修改一处地方,都会牵一发而动全身,这就是设计不当。

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。
    利用类,抽象或接口等把多个相似的具体产品抽象化,近而可以创建一个返回此抽象类型的工厂,来实例化具体类。 至少需要三个角色:工厂类角色、抽象产品角色、具体产品角色。

    开放-封闭原则针对扩展是开放的,针对修改是封闭的,是面向对象设计的核心所在,遵循这个原则可以带来巨大好处,可扩展、可维护、可复用。

    里氏代换原则Liskov Substitution Principle,简称LSP。子类型必须能替换掉他们的父类型。换句话说,在软件里面,把使用父类的地方,都换成子类,程序的行为是没有变化的。这是面向对象语言继承的基础,如果没有里氏代换原则,也就谈不上开放-关闭原则了

    工厂方法模式是属于简单工厂模式的进化版,根据开放封装原则来优化,Facotry Method 让一个类的实例化延迟到子类中,具体来讲就是为每个产品定义一个子工厂让其去实例化自己的产品。

    抽象工厂模式是属于工厂方法模式的进化版,专注于产品族。提供一个接口可以创建一组相关或依赖类,而不用指定他们具体的创建类。

    适配器模式声明一个继承自目标类的适配器类,在其中声明一个需要适配的类的对象,然后保持父类的接口不变,而在方法内部调用适配对象的方法,从而达到接口交融的目标。

    使用:Logger.Information("Sending message {0}", type);
    属性:public ILogger Logger { get; set; }
    默认构造函数:  Logger = NullLogger.Instance;
    

    NullLogger通过单一模式所创建的空对象。此空对象什么也不记录,并且IsEnabled会返回不可用。

        public class NullLogger : ILogger {
        private static readonly ILogger _instance = new NullLogger();
    
        public static ILogger Instance {
            get { return _instance; }
        }
    
        public bool IsEnabled(LogLevel level) {
            return false;
        }
    
        public void Log(LogLevel level, Exception exception, string format, params object[] args) {
        }
    }
    

    LogLevel枚举定义与ILogger接口定义

      public enum LogLevel {
        Debug,
        Information,
        Warning,
        Error,
        Fatal
    }
    
    public interface ILogger {
        bool IsEnabled(LogLevel level);
        void Log(LogLevel level, Exception exception, string format, params object[] args);
    }
    
    • static LoggingExtensions 来定义Log的多个扩展接口。主要分为四种情况:是否带异常信息与是否带格式化提示信息。*

      public static class LoggingExtensions {
      public static void Debug(this ILogger logger, string message) {
      FilteredLog(logger, LogLevel.Debug, null, message, null);
      }
      private static void FilteredLog(ILogger logger, LogLevel level, Exception exception, string format, object[] objects) {
      if (logger.IsEnabled(level)) {
      logger.Log(level, exception, format, objects);
      }
      }


    接下来便是Autofac属性注入

    异步与多线程区别与联系两者都可以达到避免线程阻塞的目的,从而提高软件的可响应性。但异步更偏向于执行I/O操作,无需额外的线程负担,使用回调的方式进行处理,很少使用共享变量,减少了死锁的可能性。==
    而多线程只是操作系统的一个逻辑功能,需要CPU投入资源来运行和调度。并且线程间的共享变量可能造成死锁的出现。所以更适合长时间CPU运算的场合。

    ConcurrentDictionary 线程安全的字典集合。

    Reflection,反射。
    这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。

    • Castle.Core.Logging
      这个不是太了解,与Spring.Net有什么区别呢?

    • LoggingModule此类采用属性注入的方式来加载前面定义的Log操作类。

      • 为什么要有属性注入?

      对于一些使用特频繁的类或者方法,很多类都会用到,那么使用属性注入会节省更多的力气,而且在设计的时候就可以提早的把该属性给定义出来。

      • 哪些需求需要用到属性注入?

      举几个比较实际的例子:日志功能、统一事务提交、当前用户附加信息的获取等等。

      • Orchard代码流程如何

    LoggingModule类创建CastleLoggerFactory和OrchardLog4netFactory

    • Orchard.Environment.OrcardStarter 的CreateHostContainer来通过反射注入整个的Log模块。

      public static class OrchardStarter {
      public static IContainer CreateHostContainer(Action registrations) {
      var builder = new ContainerBuilder();
      builder.RegisterModule(new LoggingModule());

    Orchard源码分析(4.2):Orchard.Logging.LoggingModule类

    • 为何CastleLogger需要通过OrchardLog4NetFactory对Log4net.Core.Ilogger进行层层包装来适配双方。
  • 相关阅读:
    重要常识
    ORACLE EBS中有些VIEW经常被OU屏蔽掉数据
    如何使用ftp从Metalink上下载补丁
    SO做了Booked之后,一直处理于“已延交”,发运事务处理的活动区变灰
    WIP模块常用表结构
    BOM查看多个物料下的子物料组件
    OE模块常用表结构
    如何诊断OM中的订单出现的问题
    INV模块常用表结构
    OM定义运费和特别费用类型
  • 原文地址:https://www.cnblogs.com/mqgh/p/4094595.html
Copyright © 2011-2022 走看看