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.

  • 相关阅读:
    在String中添加移动构造函数和移动赋值运算符
    自定义String类,并且实现在STL容器中添加自定义的类型
    allocator例子
    Messages的例子
    java unicode转中文
    Oracle Unicode转中文(解码)
    dom4j解析XML
    如何下载HLS视频到本地(m3u8)
    background-position
    XMPP协议实现即时通讯底层书写 (二)-- IOS XMPPFramework Demo+分析
  • 原文地址:https://www.cnblogs.com/llcto/p/1947917.html
Copyright © 2011-2022 走看看