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

依赖倒置原则也叫依赖倒转原则,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进行层层包装来适配双方。

Orchard 源码探索(Log)的更多相关文章

  1. Orchard 源码探索(Module,Theme,Core扩展加载概述)

    参考: http://www.orchardch.com/Blog/20120830071458 1. host.Initialize(); private static IOrchardHost H ...

  2. Orchard 源码探索(Localization)之国际化与本地化

    本地化与国际化 基本上相关代码都在在Orchard.Framework.Localization中. T("english")是如何调用到WebViewPage.cs中的Local ...

  3. Orchard 源码探索(Application_Start)之异步委托调用

    2014年5月26日 10:26:31 晴 ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为ApplicationManager 的类会创建一个应用程序域.应用程序域为全局变量提供应用程 ...

  4. Golang源码探索(三) GC的实现原理(转)

    Golang从1.5开始引入了三色GC, 经过多次改进, 当前的1.9版本的GC停顿时间已经可以做到极短.停顿时间的减少意味着"最大响应时间"的缩短, 这也让go更适合编写网络服务 ...

  5. Orchard源码分析(5):Host相关(Orchard.Environment.DefaultOrchardHost类)

    概述 Host 是应用程序域级的单例,代表了Orchard应用程序.其处理应用程序生命周期中的初始化.BeginRequest事件.EndRequest事件等. 可以简单理解为HttpApplicat ...

  6. Eureka源码探索(一)-客户端服务端的启动和负载均衡

    1. Eureka源码探索(一)-客户端服务端的启动和负载均衡 1.1. 服务端 1.1.1. 找起始点 目前唯一知道的,就是启动Eureka服务需要添加注解@EnableEurekaServer,但 ...

  7. Golang源码探索(二) 协程的实现原理(转)

    Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱,虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底 ...

  8. Golang源码探索(一) 编译和调试源码(转)

    GO可以说是近几年最热门的新兴语言之一了, 一般人看到分布式和大数据就会想到GO,这个系列的文章会通过研究golang的源代码来分析内部的实现原理,和CoreCLR不同的是, golang的源代码已经 ...

  9. 【腾讯Bugly干货分享】深入源码探索 ReactNative 通信机制

    Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 本文从源码角度剖析 RNA 中 J ...

随机推荐

  1. iOS开发之性能优化

    1.避免过于庞大的XIB 当加载XIB的时候把所有的东西都放在了内存里,包括任何的图片:如果有一个不会即刻用到的view,就会浪费宝贵的内存资源了. 当加载一个引用了图片或者声音资源的nib时,nib ...

  2. DWZ 框架remote 验证字段唯一性方法提交后台,如果是中文会显示成乱码问题

    关于jquery  remote 验证字段唯一性方法提交后台,如果是中文会显示成乱码问题.可以直接修改tomcat 配置文件server.xml  设置 URIEncoding=utf-8属性,将ge ...

  3. 给Extjs的GridPanel增加“合计”行(转)

    再Google,找到一个看似写的比较好的 http://www.cnblogs.com/over140/archive/2009/05/06/1449892.html 期间主要部分也是借鉴官方论坛上的 ...

  4. Android 不通过USB数据线调试的方法

    在开发Android应用时,通常情况下是通过USB数据线连接设备和计算机,但对于一些需要使用USB设备的应用,这种方法就碰到了麻烦,手机的USB接口已经和外接的USB设备连接,无法再连数据线,此时可以 ...

  5. Android_实现静默安装和卸载应用

    转:http://www.cnblogs.com/ondream/archive/2012/04/13/2446138.html 前段时间做了一个批量安装卸载应用程序的小应用,由于安装卸载应用程序的部 ...

  6. Android 启动APP黑屏解决方案

    #Android 启动APP黑屏解决方案# 1.自定义Theme //1.设置背景图Theme <style name="Theme.AppStartLoad" parent ...

  7. Redis深入学习(1)前言&Redis简介

    前言 最近工作上使用到Redis,当然以前也使用过redis,win,linux上都使用过,不系统,不深入,仅是头痛医头,脚痛医脚,这里整理一下自己的笔记,一来方便自己记忆,二来对同行提供借鉴,不足错 ...

  8. vb 6.0 msflexgrid 用法详解

    问题一 msflexgrid 根据行数或列数的大小,滚动条的滚动块长度怎么改变,发现滚动条很不好用,很小

  9. 让QT对话框显示中文

    http://blog.sina.com.cn/s/blog_8254427901011fxv.html (1)从QT安装目录下面将文件“qt_zh_CN.qm”复制一份到你的项目目录下. 例如,我是 ...

  10. 【Chromium中文文档】OS X 沙箱设计

    OS X 沙箱设计 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/OSX ...