zoukankan      html  css  js  c++  java
  • Orchard架构介绍

      在如何使用Orchard搭建敏捷个人的网站(2)中介绍了如何使用Orchard,但对于我们来说,更重要的是学习Orchard是如何架构的,如果我们自己编写一个类似应用该如何做。今天有空再次看看Orchard的其它内容,本篇介绍一下Orchard的一些架构方面的内容。Orchard内容较多,现在还只是了解一些皮毛,还有待进一步学习,放上来权当随笔记录。

    Architecture

    Orchard foundations

    Orchard构建在已有的一些框架和类库之上,下面是一些主要内容:

    • ASP.NET MVC:这是微软开源的基于MVC的Web开发框架
    • NHibernate:NHibernate 是一个ORM工具,从Hibernate演化而来
    • Autofac: 一个IoC container。Orchard大量使用依赖注入
    • Castle Dynamic Proxy: Castle 是.Net中很早就出现的一个开源项目,Castle Dynamic Proxy是一个生产动态代理的东东

    Orchard Framework

    Orchard framework处于Orchard的最底层,你可以把它看成是Orchard的基础类库。

    • Orchard的启动
    1. 当Orchard web应用启动后,生成一个应用域级别的单例的Orchard Host(DefaultOrchardHost)
      View Code
      public class MvcApplication : HttpApplication {

      protected void Application_Start() {

      _host
      = OrchardStarter.CreateHost(MvcSingletons);
      _host.Initialize();

      }

      public static class OrchardStarter {

      public static IOrchardHost CreateHost(Action<ContainerBuilder> registrations) {

      var container
      = CreateHostContainer(registrations);

      return container.Resolve<IOrchardHost>();

      }

      public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {

      ……

      builder.RegisterType
      <DefaultOrchardHost>().As<IOrchardHost>().As<IEventHandler>().SingleInstance();

      }

      }
    2. DefaultOrchardHost负责生成Shell,其中引入了一些类:ShellContextFactoryExtensionManagerShellSettingsManagerCompositionStrategyShellBlueprint,现在就不细说了,因为我还没有怎么看
    View Code
    public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler {

    void IOrchardHost.Initialize() {

    BuildCurrent();

    }

    IEnumerable
    <ShellContext> BuildCurrent() {

    if (_current == null) {

    lock (_syncLock) {

    if (_current == null) {

    SetupExtensions();

    MonitorExtensions();

    _current
    = CreateAndActivate().ToArray();

    }

    }

    }

    return _current;

    }


    IEnumerable
    <ShellContext> CreateAndActivate() {

    var allSettings
    = _shellSettingsManager.LoadSettings();

    if (allSettings.Any()) {

    return allSettings.Select(

    settings
    => {

    var context
    = CreateShellContext(settings);

    ActivateShell(context);

    return context;

    });

    }

    ……

    }


    ShellContext CreateShellContext(ShellSettings settings) {

    if (settings.State.CurrentState == TenantState.State.Uninitialized) {

    Logger.Debug(
    "Creating shell context for tenant {0} setup", settings.Name);

    return _shellContextFactory.CreateSetupContext(settings);

    }


    Logger.Debug(
    "Creating shell context for tenant {0}", settings.Name);

    return _shellContextFactory.CreateShellContext(settings);

    }

    }
    • Dependency injection

    在Orchard中生成依赖项的标准方法是实现IDependency 或者其继承接口。

    对于依赖有三种可能的范围,具体讲解等待后期分析:

              o Request:每次HTTP请求都创建一个新的实例,请求处理有销毁。这种对象实现IDependency
              o Object:实现ITransientDependency,实例不共享
              o Shell: 实现ISingletonDependency,单例

    • ASP.NET MVC

    Orchard是构建在ASP.NET MVC 之上的一个框架,但是为了增加主题、多租户等额外功能而也挺入了额外的一些层和概念。例如,当需要一个特定视图时引入LayoutAwareViewEngine。严格的说,这不是一个新的视图引擎,因为它并不关心实际绘制,而只是包含一些查找当前主题下正确视图的一些逻辑功能,然后委托给实际的视图引擎去展现。

    Types, Parts and Fields

    Orchard能够处理任意内容类型(content types),内容类型又是由内容Parts组成,例如一个blog、video都可能有地址、回复、tag等,为了重用可以把回复作为一个part存在于一个module中,这样只需要生成一次就行了。

    Parts本身又有自己的属性和内容字段。内容字段(Fields)也是一个重用的概念,它比parts更细粒度,它可以使用在多个part中。

    Content Manager

    所有的内容通过ContentManager 对象进行访问,ContentManager有查询内容存储、版本内容和管理发布状态等功能

    Transactions

    Orchard自动为每次HTTP请求生成一个事务

    Event bus

    Commands

    很多在Orchard中可以执行的动作都可以通过命令行形式执行,这些Command都需要实现,命令方法使用CommandName 属性标识

    Search and indexing

    默认使用Lucene 进行索引和查询

    Caching

    基于ASP.NET cache之上的缓存,Orchard缓存API主要好处是对每个租户的透明性

    File systems

    Orchard的文件系统是抽象概念的,可以是直接的物理文件,也可以是部署在云端的blob storage

    Orchard core

    Orchard.Core 程序集包含Orchard必须使用到的一些模块,例如feeds、navigation和routable

    Modules

    Orchard默认发布一些内建的模块,例如blog等。一个模块只是一个包含manifest.txt 文件的一个ASP.NET MVC area 文件。

    Themes

    Orchard有一个基本的设计原则,那就是主题的所有HTML都可以被替换。Orchard是基于shapes来展现的,主题引擎的工作就是发现当前主题,并未当前每一个shape找到最佳的展现方式。每一个shape可以通过模块的视图目录或者通过代码方式来获取一个默认的展现方式。

    参考:How Orchard Works

    推荐:你可能需要的在线电子书 

    我的新浪围脖: http://t.sina.com.cn/openexpressapp

    欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]


  • 相关阅读:
    js 所有事件列表
    ironpython
    BAT批处理基本命令总结
    cmd命令行大全 dos命令 cmd命令整理
    Oracle向MySQL迁移
    python html转pdf
    python3 图片验证码
    Python 发送邮件
    如何卸载虚拟机
    django开发网站 让局域网中的电脑访问你的主机
  • 原文地址:https://www.cnblogs.com/zhoujg/p/1950766.html
Copyright © 2011-2022 走看看