zoukankan      html  css  js  c++  java
  • Orchard代码学习笔记 1. 入口

    1.Orchard.Web.MvcApplication,Orchard.Web

    protected void Application_Start() {
        RegisterRoutes(RouteTable.Routes);

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

    2.Orchard.Environment.OrchardStarter,Orchard.Framework

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.IO;
    using System.Web.Hosting;
    using System.Web.Mvc;
    using Autofac;
    using Autofac.Configuration;
    using Orchard.Caching;
    using Orchard.Environment.Configuration;
    using Orchard.Environment.Extensions;
    using Orchard.Environment.Extensions.Compilers;
    using Orchard.Environment.Extensions.Folders;
    using Orchard.Environment.Extensions.Loaders;
    using Orchard.Environment.ShellBuilders;
    using Orchard.Environment.State;
    using Orchard.Environment.Descriptor;
    using Orchard.Events;
    using Orchard.FileSystems.AppData;
    using Orchard.FileSystems.Dependencies;
    using Orchard.FileSystems.VirtualPath;
    using Orchard.FileSystems.WebSite;
    using Orchard.Logging;
    using Orchard.Mvc;
    using Orchard.Mvc.ViewEngines.Razor;
    using Orchard.Mvc.ViewEngines.ThemeAwareness;
    using Orchard.Services;

    namespace Orchard.Environment {
        
    public static class OrchardStarter {
            
    public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {
                var builder 
    = new ContainerBuilder();
                builder.RegisterModule(
    new LoggingModule());
                builder.RegisterModule(
    new EventsModule());
                builder.RegisterModule(
    new CacheModule());

                
    // a single default host implementation is needed for bootstrapping a web app domain
                builder.RegisterType<DefaultOrchardEventBus>().As<IEventBus>().SingleInstance();
                builder.RegisterType
    <DefaultCacheHolder>().As<ICacheHolder>().SingleInstance();
                builder.RegisterType
    <DefaultHostEnvironment>().As<IHostEnvironment>().SingleInstance();
                builder.RegisterType
    <DefaultHostLocalRestart>().As<IHostLocalRestart>().SingleInstance();
                builder.RegisterType
    <DefaultBuildManager>().As<IBuildManager>().SingleInstance();
                builder.RegisterType
    <WebFormVirtualPathProvider>().As<ICustomVirtualPathProvider>().SingleInstance();
                builder.RegisterType
    <DynamicModuleVirtualPathProvider>().As<ICustomVirtualPathProvider>().SingleInstance();
                builder.RegisterType
    <AppDataFolderRoot>().As<IAppDataFolderRoot>().SingleInstance();
                builder.RegisterType
    <DefaultExtensionCompiler>().As<IExtensionCompiler>().SingleInstance();
                builder.RegisterType
    <DefaultRazorCompilationEvents>().As<IRazorCompilationEvents>().SingleInstance();
                builder.RegisterType
    <DefaultProjectFileParser>().As<IProjectFileParser>().SingleInstance();
                builder.RegisterType
    <DefaultAssemblyLoader>().As<IAssemblyLoader>().SingleInstance();
                builder.RegisterType
    <AppDomainAssemblyNameResolver>().As<IAssemblyNameResolver>().SingleInstance();
                builder.RegisterType
    <GacAssemblyNameResolver>().As<IAssemblyNameResolver>().SingleInstance();
                builder.RegisterType
    <OrchardFrameworkAssemblyNameResolver>().As<IAssemblyNameResolver>().SingleInstance();
                builder.RegisterType
    <HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
                builder.RegisterType
    <ViewsBackgroundCompilation>().As<IViewsBackgroundCompilation>().SingleInstance();

                RegisterVolatileProvider
    <WebSiteFolder, IWebSiteFolder>(builder);
                RegisterVolatileProvider
    <AppDataFolder, IAppDataFolder>(builder);
                RegisterVolatileProvider
    <Clock, IClock>(builder);
                RegisterVolatileProvider
    <DefaultDependenciesFolder, IDependenciesFolder>(builder);
                RegisterVolatileProvider
    <DefaultAssemblyProbingFolder, IAssemblyProbingFolder>(builder);
                RegisterVolatileProvider
    <DefaultVirtualPathMonitor, IVirtualPathMonitor>(builder);
                RegisterVolatileProvider
    <DefaultVirtualPathProvider, IVirtualPathProvider>(builder);

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

                    builder.RegisterType
    <ShellContextFactory>().As<IShellContextFactory>().SingleInstance();
                    {
                        builder.RegisterType
    <ShellDescriptorCache>().As<IShellDescriptorCache>().SingleInstance();

                        builder.RegisterType
    <CompositionStrategy>().As<ICompositionStrategy>().SingleInstance();
                        {
                            builder.RegisterType
    <ShellContainerRegistrations>().As<IShellContainerRegistrations>().SingleInstance();
                            builder.RegisterType
    <ExtensionLoaderCoordinator>().As<IExtensionLoaderCoordinator>().SingleInstance();
                            builder.RegisterType
    <ExtensionManager>().As<IExtensionManager>().SingleInstance();
                            {
                                builder.RegisterType
    <ModuleFolders>().As<IExtensionFolders>().SingleInstance()
                                    .WithParameter(
    new NamedParameter("paths"new[] { "~/Core""~/Modules" }));
                                builder.RegisterType
    <ThemeFolders>().As<IExtensionFolders>().SingleInstance()
                                    .WithParameter(
    new NamedParameter("paths"new[] { "~/Core""~/Themes" }));

                                builder.RegisterType
    <CoreExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                                builder.RegisterType
    <ReferencedExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                                builder.RegisterType
    <PrecompiledExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                                builder.RegisterType
    <DynamicExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                                builder.RegisterType
    <RawThemeExtensionLoader>().As<IExtensionLoader>().SingleInstance();
                            }
                        }

                        builder.RegisterType
    <ShellContainerFactory>().As<IShellContainerFactory>().SingleInstance();
                    }

                    builder.RegisterType
    <DefaultProcessingEngine>().As<IProcessingEngine>().SingleInstance();
                }

                builder.RegisterType
    <RunningShellTable>().As<IRunningShellTable>().SingleInstance();
                builder.RegisterType
    <DefaultOrchardShell>().As<IOrchardShell>().InstancePerMatchingLifetimeScope("shell");

                registrations(builder);


                var autofacSection 
    = ConfigurationManager.GetSection(ConfigurationSettingsReader.DefaultSectionName);
                
    if (autofacSection != null)
                    builder.RegisterModule(
    new ConfigurationSettingsReader());

                var optionalHostConfig 
    = HostingEnvironment.MapPath("~/Config/Host.config");
                
    if (File.Exists(optionalHostConfig))
                    builder.RegisterModule(
    new ConfigurationSettingsReader(ConfigurationSettingsReader.DefaultSectionName, optionalHostConfig));

                var optionalComponentsConfig 
    = HostingEnvironment.MapPath("~/Config/HostComponents.config");
                
    if (File.Exists(optionalComponentsConfig))
                    builder.RegisterModule(
    new HostComponentsConfigModule(optionalComponentsConfig));


                var container 
    = builder.Build();

                
    //
                
    // Register Virtual Path Providers
                
    //
                if (HostingEnvironment.IsHosted) {
                    
    foreach (var vpp in container.Resolve<IEnumerable<ICustomVirtualPathProvider>>()) {
                        HostingEnvironment.RegisterVirtualPathProvider(vpp.Instance);
                    }
                }

                ControllerBuilder.Current.SetControllerFactory(
    new OrchardControllerFactory());
                ViewEngines.Engines.Clear();
                ViewEngines.Engines.Add(
    new ThemeAwareViewEngineShim());

                var hostContainer 
    = new DefaultOrchardHostContainer(container);
                
    //MvcServiceLocator.SetCurrent(hostContainer);
                OrchardHostContainerRegistry.RegisterHostContainer(hostContainer);

                
    return container;
            }


            
    private static void RegisterVolatileProvider<TRegister, TService>(ContainerBuilder builder) where TService : IVolatileProvider {
                builder.RegisterType
    <TRegister>()
                    .As
    <TService>()
                    .As
    <IVolatileProvider>()
                    .SingleInstance();
            }

            
    public static IOrchardHost CreateHost(Action<ContainerBuilder> registrations) {
                var container 
    = CreateHostContainer(registrations);
                
    return container.Resolve<IOrchardHost>();
            }
        }
    }

    3.Orchard.Environment.ShellBuilders.ShellContainerFactory,Orchard.Framework

    using System;
    using System.IO;
    using System.Linq;
    using System.Web.Hosting;
    using System.Web.Mvc;
    using Autofac;
    using Autofac.Builder;
    using Autofac.Configuration;
    using Autofac.Core;
    using Autofac.Features.Indexed;
    using Orchard.Environment.AutofacUtil.DynamicProxy2;
    using Orchard.Environment.Configuration;
    using Orchard.Environment.ShellBuilders.Models;
    using Orchard.Events;

    namespace Orchard.Environment.ShellBuilders {

        
    public interface IShellContainerFactory {
            ILifetimeScope CreateContainer(ShellSettings settings, ShellBlueprint blueprint);
        }

        
    public class ShellContainerFactory : IShellContainerFactory {
            
    private readonly ILifetimeScope _lifetimeScope;
            
    private readonly IShellContainerRegistrations _shellContainerRegistrations;

            
    public ShellContainerFactory(ILifetimeScope lifetimeScope, IShellContainerRegistrations shellContainerRegistrations) {
                _lifetimeScope 
    = lifetimeScope;
                _shellContainerRegistrations 
    = shellContainerRegistrations;
            }

            
    public ILifetimeScope CreateContainer(ShellSettings settings, ShellBlueprint blueprint) {
                var intermediateScope 
    = _lifetimeScope.BeginLifetimeScope(
                    builder 
    => {
                        
    foreach (var item in blueprint.Dependencies.Where(t => typeof(IModule).IsAssignableFrom(t.Type))) {
                            var registration 
    = RegisterType(builder, item)
                                .Keyed
    <IModule>(item.Type)
                                .InstancePerDependency();

                            
    foreach (var parameter in item.Parameters) {
                                registration 
    = registration
                                    .WithParameter(parameter.Name, parameter.Value)
                                    .WithProperty(parameter.Name, parameter.Value);
                            }
                        }
                    });

                
    return intermediateScope.BeginLifetimeScope(
                    
    "shell",
                    builder 
    => {
                        var dynamicProxyContext 
    = new DynamicProxyContext();

                        builder.Register(ctx 
    => dynamicProxyContext);
                        builder.Register(ctx 
    => settings);
                        builder.Register(ctx 
    => blueprint.Descriptor);
                        builder.Register(ctx 
    => blueprint);

                        var moduleIndex 
    = intermediateScope.Resolve<IIndex<Type, IModule>>();
                        
    foreach (var item in blueprint.Dependencies.Where(t => typeof(IModule).IsAssignableFrom(t.Type))) {
                            builder.RegisterModule(moduleIndex[item.Type]);
                        }

                        
    foreach (var item in blueprint.Dependencies.Where(t => typeof(IDependency).IsAssignableFrom(t.Type))) {
                            var registration 
    = RegisterType(builder, item)
                                .EnableDynamicProxy(dynamicProxyContext)
                                .InstancePerLifetimeScope();

                            
    foreach (var interfaceType in item.Type.GetInterfaces()
                                .Where(itf 
    => typeof(IDependency).IsAssignableFrom(itf) 
                                          
    && !typeof(IEventHandler).IsAssignableFrom(itf))) {
                                registration 
    = registration.As(interfaceType);
                                
    if (typeof(ISingletonDependency).IsAssignableFrom(interfaceType)) {
                                    registration 
    = registration.InstancePerMatchingLifetimeScope("shell");
                                } 
                                
    else if (typeof(IUnitOfWorkDependency).IsAssignableFrom(interfaceType)) {
                                    registration 
    = registration.InstancePerMatchingLifetimeScope("work");
                                }
                                
    else if (typeof(ITransientDependency).IsAssignableFrom(interfaceType)) {
                                    registration 
    = registration.InstancePerDependency();
                                }
                            }

                            
    if (typeof(IEventHandler).IsAssignableFrom(item.Type)) {
                                registration 
    = registration.As(typeof(IEventHandler));
                            }

                            
    foreach (var parameter in item.Parameters) {
                                registration 
    = registration
                                    .WithParameter(parameter.Name, parameter.Value)
                                    .WithProperty(parameter.Name, parameter.Value);
                            }
                        }

                        
    foreach (var item in blueprint.Controllers) {
                            var serviceKeyName 
    = (item.AreaName + "/" + item.ControllerName).ToLowerInvariant();
                            var serviceKeyType 
    = item.Type;
                            RegisterType(builder, item)
                                .EnableDynamicProxy(dynamicProxyContext)
                                .Keyed
    <IController>(serviceKeyName)
                                .Keyed
    <IController>(serviceKeyType)
                                .WithMetadata(
    "ControllerType", item.Type)
                                .InstancePerDependency()
                                .OnActivating(e 
    => {
                                                  var controller 
    = e.Instance as Controller;
                                                  
    if (controller != null)
                                                      controller.ActionInvoker 
    = (IActionInvoker)e.Context.Resolve(new TypedService(typeof(IActionInvoker)));
                                              });
                        }

                        
    // Register code-only registrations specific to a shell
                        _shellContainerRegistrations.Registrations(builder);

                        var optionalShellConfig 
    = HostingEnvironment.MapPath("~/Config/Sites.config");
                        
    if (File.Exists(optionalShellConfig))
                            builder.RegisterModule(
    new ConfigurationSettingsReader(ConfigurationSettingsReader.DefaultSectionName, optionalShellConfig));

                        var optionalShellByNameConfig 
    = HostingEnvironment.MapPath("~/Config/Sites." + settings.Name + ".config");
                        
    if (File.Exists(optionalShellByNameConfig))
                            builder.RegisterModule(
    new ConfigurationSettingsReader(ConfigurationSettingsReader.DefaultSectionName, optionalShellByNameConfig));
                    });
            }

            
    private IRegistrationBuilder<object, ConcreteReflectionActivatorData, SingleRegistrationStyle> RegisterType(ContainerBuilder builder, ShellBlueprintItem item) {
                
    return builder.RegisterType(item.Type)
                    .WithProperty(
    "Feature", item.Feature)
                    .WithMetadata(
    "Feature", item.Feature);
            }
        }
    }

    4.来自Orchard官方网站Documentation中的说明

    Dependency injection

    The standard way of creating injectable dependencies in Orchard is to create an interface that derives from IDependency or one of its derived interfaces and then to implement that interface. On the consuming side, you can take a parameter of the interface type in your constructor. The application framework will discover all dependencies and will take care of instantiating and injecting instances as needed.

    There are three different possible scopes for dependencies, and choosing one is done by deriving from the right interface:

    • Request: a dependency instance is created for each new HTTP request and is destroyed once the request has been processed. Use this by deriving your interface from IDependency. The object should be reasonably cheap to create.
    • Object: a new instance is created every single time an object takes a dependency on the interface. Instances are never shared. Use this by deriving from ITransientDependency. The objects must be extremely cheap to create.
    • Shell: only one instance is created per shell/tenant. Use this by deriving from ISingletonDependency. Only use this for objects that must maintain a common state for the lifetime of the shell.

  • 相关阅读:
    【常用配置】Spring框架web.xml通用配置
    3.从AbstractQueuedSynchronizer(AQS)说起(2)——共享模式的锁获取与释放
    2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放
    1.有关线程、并发的基本概念
    0.Java并发包系列开篇
    SpringMVC——DispatcherServlet的IoC容器(Web应用的IoC容器的子容器)创建过程
    关于String的问题
    Spring——Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)
    <<、>>、>>>移位操作
    System.arraycopy(src, srcPos, dest, destPos, length) 与 Arrays.copyOf(original, newLength)区别
  • 原文地址:https://www.cnblogs.com/llcto/p/1947917.html
Copyright © 2011-2022 走看看