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.