mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Refactoring a csproj file compiler/build provider
* Removed unused "ServiceLocator" class * Added "OrchardHostContainerRegistry" class to enable Shim/HostContainer registration for DI * Refactored the BuildProvider for .csproj file to use the new OrchardHostContainerRegistry class and enable proper DI for implementations. --HG-- branch : dev
This commit is contained in:
@@ -270,46 +270,4 @@ namespace Orchard.Users.Controllers {
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
public interface IMembershipServiceShim {
|
||||
int MinPasswordLength { get; }
|
||||
|
||||
bool ValidateUser(string userName, string password);
|
||||
MembershipCreateStatus CreateUser(string userName, string password, string email);
|
||||
bool ChangePassword(string userName, string oldPassword, string newPassword);
|
||||
}
|
||||
|
||||
public class AccountMembershipService : IMembershipServiceShim {
|
||||
private readonly MembershipProvider _provider;
|
||||
|
||||
public AccountMembershipService()
|
||||
: this(null) { }
|
||||
|
||||
public AccountMembershipService(MembershipProvider provider) {
|
||||
_provider = provider ?? Membership.Provider;
|
||||
}
|
||||
|
||||
#region IMembershipService Members
|
||||
|
||||
public int MinPasswordLength {
|
||||
get { return _provider.MinRequiredPasswordLength; }
|
||||
}
|
||||
|
||||
public bool ValidateUser(string userName, string password) {
|
||||
return _provider.ValidateUser(userName, password);
|
||||
}
|
||||
|
||||
public MembershipCreateStatus CreateUser(string userName, string password, string email) {
|
||||
MembershipCreateStatus status;
|
||||
_provider.CreateUser(userName, password, email, null, null, true, null, out status);
|
||||
return status;
|
||||
}
|
||||
|
||||
public bool ChangePassword(string userName, string oldPassword, string newPassword) {
|
||||
var currentUser = _provider.GetUser(userName, true /* userIsOnline */);
|
||||
return currentUser.ChangePassword(oldPassword, newPassword);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
@@ -10,15 +10,15 @@
|
||||
<configuration>
|
||||
|
||||
<appSettings/>
|
||||
<system.diagnostics configSource="Config\Diagnostics.config"/>
|
||||
<!--
|
||||
<system.diagnostics configSource="Config\Diagnostics.config"/>
|
||||
<!--
|
||||
Set default transaction timeout to 30 minutes so that interactive debugging
|
||||
is easier (default timeout is less than one minute)
|
||||
-->
|
||||
<system.transactions>
|
||||
<defaultSettings timeout="00:30:00"/>
|
||||
</system.transactions>
|
||||
<system.web>
|
||||
<system.transactions>
|
||||
<defaultSettings timeout="00:30:00"/>
|
||||
</system.transactions>
|
||||
<system.web>
|
||||
<httpRuntime requestValidationMode="2.0" />
|
||||
<!--
|
||||
Set compilation debug="true" to insert debugging
|
||||
@@ -26,28 +26,29 @@
|
||||
affects performance, set this value to true only
|
||||
during development.
|
||||
-->
|
||||
<compilation debug="true" targetFramework="4.0">
|
||||
<compilation debug="true" targetFramework="4.0">
|
||||
<buildProviders>
|
||||
<add extension=".csproj" type="Orchard.Environment.Extensions.Compilers.CSharpExtensionBuildProvider"/>
|
||||
<add extension=".csproj" type="Orchard.Environment.Extensions.Compilers.CSharpExtensionBuildProviderShim"/>
|
||||
</buildProviders>
|
||||
<assemblies>
|
||||
<add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/></assemblies>
|
||||
</compilation>
|
||||
<!--
|
||||
<add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
|
||||
</assemblies>
|
||||
</compilation>
|
||||
<!--
|
||||
The <authentication> section enables configuration
|
||||
of the security authentication mode used by
|
||||
ASP.NET to identify an incoming user.
|
||||
-->
|
||||
<authentication mode="Forms">
|
||||
<forms loginUrl="~/Users/Account/AccessDenied" timeout="2880"/>
|
||||
</authentication>
|
||||
<membership defaultProvider="OrchardMembershipProvider">
|
||||
<providers>
|
||||
<clear/>
|
||||
<!--<add name="AspNetSqlMembershipProvider"
|
||||
<authentication mode="Forms">
|
||||
<forms loginUrl="~/Users/Account/AccessDenied" timeout="2880"/>
|
||||
</authentication>
|
||||
<membership defaultProvider="OrchardMembershipProvider">
|
||||
<providers>
|
||||
<clear/>
|
||||
<!--<add name="AspNetSqlMembershipProvider"
|
||||
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
|
||||
connectionStringName="ApplicationServices"
|
||||
enablePasswordRetrieval="false"
|
||||
@@ -62,68 +63,68 @@
|
||||
passwordStrengthRegularExpression=""
|
||||
applicationName="/"
|
||||
/>-->
|
||||
<add name="OrchardMembershipProvider" type="Orchard.Security.Providers.OrchardMembershipProvider, Orchard.Framework" applicationName="/"/>
|
||||
</providers>
|
||||
</membership>
|
||||
<profile>
|
||||
<providers>
|
||||
<clear/>
|
||||
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/"/>
|
||||
</providers>
|
||||
</profile>
|
||||
<roleManager enabled="false">
|
||||
<providers>
|
||||
<clear/>
|
||||
<add name="OrchardRoleProvider" type="Orchard.Security.Providers.OrchardRoleProvider, Orchard.Framework"/>
|
||||
<add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
|
||||
<add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
|
||||
</providers>
|
||||
</roleManager>
|
||||
<!--
|
||||
<add name="OrchardMembershipProvider" type="Orchard.Security.Providers.OrchardMembershipProvider, Orchard.Framework" applicationName="/"/>
|
||||
</providers>
|
||||
</membership>
|
||||
<profile>
|
||||
<providers>
|
||||
<clear/>
|
||||
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" applicationName="/"/>
|
||||
</providers>
|
||||
</profile>
|
||||
<roleManager enabled="false">
|
||||
<providers>
|
||||
<clear/>
|
||||
<add name="OrchardRoleProvider" type="Orchard.Security.Providers.OrchardRoleProvider, Orchard.Framework"/>
|
||||
<add connectionStringName="ApplicationServices" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
|
||||
<add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
|
||||
</providers>
|
||||
</roleManager>
|
||||
<!--
|
||||
The <customErrors> section enables configuration
|
||||
of what to do if/when an unhandled error occurs
|
||||
during the execution of a request. Specifically,
|
||||
it enables developers to configure html error pages
|
||||
to be displayed in place of a error stack trace.
|
||||
-->
|
||||
<customErrors mode="Off"/>
|
||||
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
|
||||
<namespaces>
|
||||
<add namespace="System.Web.Mvc"/>
|
||||
<add namespace="System.Web.Mvc.Ajax"/>
|
||||
<add namespace="System.Web.Mvc.Html"/>
|
||||
<add namespace="System.Web.Routing"/>
|
||||
<add namespace="System.Linq"/>
|
||||
<add namespace="System.Collections.Generic"/>
|
||||
<add namespace="Orchard.Mvc.Html"/>
|
||||
</namespaces>
|
||||
</pages>
|
||||
<httpHandlers>
|
||||
<add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
</httpHandlers>
|
||||
</system.web>
|
||||
<system.web.extensions/>
|
||||
<!--
|
||||
<customErrors mode="Off"/>
|
||||
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
|
||||
<namespaces>
|
||||
<add namespace="System.Web.Mvc"/>
|
||||
<add namespace="System.Web.Mvc.Ajax"/>
|
||||
<add namespace="System.Web.Mvc.Html"/>
|
||||
<add namespace="System.Web.Routing"/>
|
||||
<add namespace="System.Linq"/>
|
||||
<add namespace="System.Collections.Generic"/>
|
||||
<add namespace="Orchard.Mvc.Html"/>
|
||||
</namespaces>
|
||||
</pages>
|
||||
<httpHandlers>
|
||||
<add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
</httpHandlers>
|
||||
</system.web>
|
||||
<system.web.extensions/>
|
||||
<!--
|
||||
The system.webServer section is required for running ASP.NET AJAX under Internet
|
||||
Information Services 7.0. It is not necessary for previous version of IIS.
|
||||
-->
|
||||
<system.webServer>
|
||||
<validation validateIntegratedModeConfiguration="false"/>
|
||||
<modules runAllManagedModulesForAllRequests="true">
|
||||
</modules>
|
||||
<handlers>
|
||||
<remove name="MvcHttpHandler"/>
|
||||
<remove name="UrlRoutingHandler"/>
|
||||
<add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
</handlers>
|
||||
</system.webServer>
|
||||
<runtime>
|
||||
<system.webServer>
|
||||
<validation validateIntegratedModeConfiguration="false"/>
|
||||
<modules runAllManagedModulesForAllRequests="true">
|
||||
</modules>
|
||||
<handlers>
|
||||
<remove name="MvcHttpHandler"/>
|
||||
<remove name="UrlRoutingHandler"/>
|
||||
<add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
|
||||
</handlers>
|
||||
</system.webServer>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<probing privatePath="App_Data/Dependencies"/>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
|
||||
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
|
||||
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
15
src/Orchard/Environment/DefaultHostContainer.cs
Normal file
15
src/Orchard/Environment/DefaultHostContainer.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using Autofac;
|
||||
|
||||
namespace Orchard.Environment {
|
||||
public class DefaultOrchardHostContainer : IOrchardHostContainer {
|
||||
private readonly IContainer _container;
|
||||
|
||||
public DefaultOrchardHostContainer(IContainer container) {
|
||||
_container = container;
|
||||
}
|
||||
|
||||
public T Resolve<T>() {
|
||||
return _container.Resolve<T>();
|
||||
}
|
||||
}
|
||||
}
|
@@ -17,14 +17,13 @@ using Orchard.Utility.Extensions;
|
||||
namespace Orchard.Environment {
|
||||
public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler {
|
||||
private readonly ControllerBuilder _controllerBuilder;
|
||||
|
||||
private readonly IShellSettingsManager _shellSettingsManager;
|
||||
private readonly IShellContextFactory _shellContextFactory;
|
||||
private readonly IRunningShellTable _runningShellTable;
|
||||
private readonly IProcessingEngine _processingEngine;
|
||||
private readonly IExtensionManager _extensionManager;
|
||||
private readonly IExtensionLoaderCoordinator _extensionLoaderCoordinator;
|
||||
private readonly ICacheManager _cacheManager;
|
||||
private readonly object _syncLock = new object();
|
||||
|
||||
private IEnumerable<ShellContext> _current;
|
||||
|
||||
@@ -33,18 +32,18 @@ namespace Orchard.Environment {
|
||||
IShellContextFactory shellContextFactory,
|
||||
IRunningShellTable runningShellTable,
|
||||
IProcessingEngine processingEngine,
|
||||
IExtensionManager extensionManager,
|
||||
IExtensionLoaderCoordinator extensionLoaderCoordinator,
|
||||
ICacheManager cacheManager,
|
||||
ControllerBuilder controllerBuilder) {
|
||||
|
||||
_shellSettingsManager = shellSettingsManager;
|
||||
_shellContextFactory = shellContextFactory;
|
||||
_runningShellTable = runningShellTable;
|
||||
_processingEngine = processingEngine;
|
||||
_extensionManager = extensionManager;
|
||||
_extensionLoaderCoordinator = extensionLoaderCoordinator;
|
||||
_cacheManager = cacheManager;
|
||||
_controllerBuilder = controllerBuilder;
|
||||
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
|
||||
@@ -82,7 +81,7 @@ namespace Orchard.Environment {
|
||||
|
||||
IEnumerable<ShellContext> BuildCurrent() {
|
||||
if (_current == null) {
|
||||
lock (this) {
|
||||
lock (_syncLock) {
|
||||
if (_current == null) {
|
||||
SetupExtensions();
|
||||
MonitorExtensions();
|
||||
|
@@ -1,26 +0,0 @@
|
||||
using System.Web.Compilation;
|
||||
using Orchard.FileSystems.VirtualPath;
|
||||
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
public class CSharpExtensionBuildProvider : BuildProvider {
|
||||
private readonly CompilerType _codeCompilerType;
|
||||
|
||||
public CSharpExtensionBuildProvider() {
|
||||
_codeCompilerType = GetDefaultCompilerTypeForLanguage("C#");
|
||||
}
|
||||
|
||||
public override CompilerType CodeCompilerType { get { return _codeCompilerType; } }
|
||||
|
||||
public override void GenerateCode(AssemblyBuilder assemblyBuilder) {
|
||||
//Debug.WriteLine(string.Format("BuildProvider for file \"{0}\"", this.VirtualPath));
|
||||
|
||||
//TODO: It probably would be better to access the OrchardHost container
|
||||
// to resolve these dependencies.
|
||||
var virtualPathProvider = new DefaultVirtualPathProvider();
|
||||
var compiler = new CSharpProjectMediumTrustCompiler(virtualPathProvider);
|
||||
|
||||
var aspNetAssemblyBuilder = new AspNetAssemblyBuilder(assemblyBuilder, this);
|
||||
compiler.CompileProject(this.VirtualPath, aspNetAssemblyBuilder);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,29 @@
|
||||
using System.Web.Compilation;
|
||||
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
public class CSharpExtensionBuildProviderShim : BuildProvider, IShim {
|
||||
private readonly CompilerType _codeCompilerType;
|
||||
|
||||
public CSharpExtensionBuildProviderShim() {
|
||||
OrchardHostContainerRegistry.RegisterShim(this);
|
||||
|
||||
_codeCompilerType = GetDefaultCompilerTypeForLanguage("C#");
|
||||
}
|
||||
|
||||
public IOrchardHostContainer HostContainer { get; set; }
|
||||
|
||||
public override CompilerType CodeCompilerType {
|
||||
get {
|
||||
return _codeCompilerType;
|
||||
}
|
||||
}
|
||||
|
||||
public override void GenerateCode(AssemblyBuilder assemblyBuilder) {
|
||||
var context = new CompileExtensionContext {
|
||||
VirtualPath = this.VirtualPath,
|
||||
AssemblyBuilder = new AspNetAssemblyBuilder(assemblyBuilder, this)
|
||||
};
|
||||
HostContainer.Resolve<IExtensionCompiler>().Compile(context);
|
||||
}
|
||||
}
|
||||
}
|
@@ -8,8 +8,9 @@ using System.Web.Compilation;
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
/// <summary>
|
||||
/// Compile a C# extension into an assembly given a directory location
|
||||
/// Note: Currently not used...
|
||||
/// </summary>
|
||||
public class CSharpExtensionCompiler {
|
||||
public class CSharpExtensionDirectoryCompiler {
|
||||
public CompilerResults CompileProject(string location) {
|
||||
var codeProvider = CodeDomProvider.CreateProvider("cs");
|
||||
|
@@ -7,6 +7,7 @@ using Orchard.FileSystems.VirtualPath;
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
/// <summary>
|
||||
/// Compile a C# extension into an assembly given a directory location
|
||||
/// Note: currently not used...
|
||||
/// </summary>
|
||||
public class CSharpProjectFullTrustCompiler {
|
||||
private readonly IVirtualPathProvider _virtualPathProvider;
|
||||
@@ -26,7 +27,7 @@ namespace Orchard.Environment.Extensions.Compilers {
|
||||
var directory = _virtualPathProvider.GetDirectoryName(virtualPath);
|
||||
|
||||
using (var stream = _virtualPathProvider.OpenFile(virtualPath)) {
|
||||
var descriptor = new CSharpProjectParser().Parse(stream);
|
||||
var descriptor = new DefaultProjectFileParser().Parse(stream);
|
||||
|
||||
var references = GetReferencedAssembliesLocation();
|
||||
var options = new CompilerParameters(references.ToArray());
|
||||
|
@@ -0,0 +1,6 @@
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
public class CompileExtensionContext {
|
||||
public string VirtualPath { get; set; }
|
||||
public IAssemblyBuilder AssemblyBuilder { get; set; }
|
||||
}
|
||||
}
|
@@ -2,28 +2,33 @@
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Orchard.FileSystems.VirtualPath;
|
||||
using Orchard.Logging;
|
||||
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
/// <summary>
|
||||
/// Compile a C# extension into an assembly given a directory location
|
||||
/// </summary>
|
||||
public class CSharpProjectMediumTrustCompiler {
|
||||
public class DefaultExtensionCompiler : IExtensionCompiler {
|
||||
private readonly IVirtualPathProvider _virtualPathProvider;
|
||||
private readonly IProjectFileParser _projectFileParser;
|
||||
|
||||
public CSharpProjectMediumTrustCompiler(IVirtualPathProvider virtualPathProvider) {
|
||||
public DefaultExtensionCompiler(IVirtualPathProvider virtualPathProvider, IProjectFileParser projectFileParser) {
|
||||
_virtualPathProvider = virtualPathProvider;
|
||||
_projectFileParser = projectFileParser;
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
/// <summary>
|
||||
/// Compile a csproj file given its virtual path, a build provider and an assembly builder.
|
||||
/// This method works in medium trust.
|
||||
/// </summary>
|
||||
public void CompileProject(string virtualPath, IAssemblyBuilder assemblyBuilder) {
|
||||
using (var stream = _virtualPathProvider.OpenFile(virtualPath)) {
|
||||
var descriptor = new CSharpProjectParser().Parse(stream);
|
||||
|
||||
var directory = _virtualPathProvider.GetDirectoryName(virtualPath);
|
||||
public ILogger Logger { get; set; }
|
||||
|
||||
public void Compile(CompileExtensionContext context) {
|
||||
Logger.Information("Generate code for file \"{0}\"", context.VirtualPath);
|
||||
|
||||
using (var stream = _virtualPathProvider.OpenFile(context.VirtualPath)) {
|
||||
var descriptor = _projectFileParser.Parse(stream);
|
||||
|
||||
var directory = _virtualPathProvider.GetDirectoryName(context.VirtualPath);
|
||||
foreach (var filename in descriptor.SourceFilenames.Select(f => _virtualPathProvider.Combine(directory, f))) {
|
||||
assemblyBuilder.AddCodeCompileUnit(CreateCompileUnit(filename));
|
||||
context.AssemblyBuilder.AddCodeCompileUnit(CreateCompileUnit(filename));
|
||||
}
|
||||
}
|
||||
}
|
@@ -5,24 +5,11 @@ using System.Xml;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
public class CSharpProjectDescriptor {
|
||||
public string AssemblyName { get; set; }
|
||||
public IEnumerable<string> SourceFilenames { get; set; }
|
||||
public IEnumerable<ReferenceDescriptor> References { get; set; }
|
||||
}
|
||||
public class DefaultProjectFileParser : IProjectFileParser {
|
||||
|
||||
public class ReferenceDescriptor {
|
||||
public string AssemblyName { get; set; }
|
||||
|
||||
public override string ToString() {
|
||||
return "{" + (AssemblyName ?? "") + "}";
|
||||
}
|
||||
}
|
||||
|
||||
public class CSharpProjectParser {
|
||||
public CSharpProjectDescriptor Parse(Stream stream) {
|
||||
public ProjectFileDescriptor Parse(Stream stream) {
|
||||
var document = XDocument.Load(XmlReader.Create(stream));
|
||||
return new CSharpProjectDescriptor {
|
||||
return new ProjectFileDescriptor {
|
||||
AssemblyName = GetAssemblyName(document),
|
||||
SourceFilenames = GetSourceFilenames(document).ToArray(),
|
||||
References = GetReferences(document).ToArray()
|
@@ -0,0 +1,5 @@
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
public interface IExtensionCompiler {
|
||||
void Compile(CompileExtensionContext context);
|
||||
}
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
using System.IO;
|
||||
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
public interface IProjectFileParser {
|
||||
ProjectFileDescriptor Parse(Stream stream);
|
||||
}
|
||||
}
|
@@ -0,0 +1,12 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.Environment.Extensions.Compilers {
|
||||
public class ProjectFileDescriptor {
|
||||
public string AssemblyName { get; set; }
|
||||
public IEnumerable<string> SourceFilenames { get; set; }
|
||||
public IEnumerable<ReferenceDescriptor> References { get; set; }
|
||||
}
|
||||
public class ReferenceDescriptor {
|
||||
public string AssemblyName { get; set; }
|
||||
}
|
||||
}
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Orchard.Caching;
|
||||
using Orchard.Environment.Extensions.Loaders;
|
||||
@@ -21,10 +20,12 @@ namespace Orchard.Environment.Extensions {
|
||||
IExtensionManager extensionManager,
|
||||
IEnumerable<IExtensionLoader> loaders,
|
||||
IHostEnvironment hostEnvironment) {
|
||||
|
||||
_dependenciesFolder = dependenciesFolder;
|
||||
_extensionManager = extensionManager;
|
||||
_loaders = loaders.OrderBy(l => l.Order);
|
||||
_hostEnvironment = hostEnvironment;
|
||||
|
||||
T = NullLocalizer.Instance;
|
||||
Logger = NullLogger.Instance;
|
||||
}
|
||||
@@ -37,19 +38,16 @@ namespace Orchard.Environment.Extensions {
|
||||
|
||||
var extensions = _extensionManager.AvailableExtensions().Where(d => d.ExtensionType == "Module").ToList();
|
||||
var existingDependencies = _dependenciesFolder.LoadDescriptors().ToList();
|
||||
|
||||
var sameExtensions = extensions.Where(e => existingDependencies.Any(e2 => e2.Name == e.Name)).ToList();
|
||||
var deletedDependencies = existingDependencies.Where(e => !extensions.Any(e2 => e2.Name == e.Name)).ToList();
|
||||
var newExtensions = extensions.Except(sameExtensions).ToList();
|
||||
|
||||
var ctx = new ExtensionLoadingContext();
|
||||
var loadingContext = new ExtensionLoadingContext();
|
||||
|
||||
// Notify all loaders about extensions removed from the web site
|
||||
foreach (var dependency in deletedDependencies) {
|
||||
Logger.Information("Extension {0} has been removed from site", dependency.Name);
|
||||
foreach (var loader in _loaders) {
|
||||
if (dependency.LoaderName == loader.Name) {
|
||||
loader.ExtensionRemoved(ctx, dependency);
|
||||
loader.ExtensionRemoved(loadingContext, dependency);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -58,11 +56,11 @@ namespace Orchard.Environment.Extensions {
|
||||
// load that extension.
|
||||
var newDependencies = new List<DependencyDescriptor>();
|
||||
foreach (var extension in extensions) {
|
||||
ProcessExtension(ctx, extension, existingDependencies, newDependencies);
|
||||
ProcessExtension(loadingContext, extension, existingDependencies, newDependencies);
|
||||
}
|
||||
|
||||
// Execute all the work need by "ctx"
|
||||
ProcessContextCommands(ctx);
|
||||
ProcessContextCommands(loadingContext);
|
||||
|
||||
// And finally save the new entries in the dependencies folder
|
||||
_dependenciesFolder.StoreDescriptors(newDependencies);
|
||||
|
5
src/Orchard/Environment/IOrchardHostContainer.cs
Normal file
5
src/Orchard/Environment/IOrchardHostContainer.cs
Normal file
@@ -0,0 +1,5 @@
|
||||
namespace Orchard.Environment {
|
||||
public interface IOrchardHostContainer {
|
||||
T Resolve<T>();
|
||||
}
|
||||
}
|
9
src/Orchard/Environment/IShim.cs
Normal file
9
src/Orchard/Environment/IShim.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace Orchard.Environment {
|
||||
/// <summary>
|
||||
/// Interface implemented by shims for ASP.NET singleton services that
|
||||
/// need access to the HostContainer instance.
|
||||
/// </summary>
|
||||
public interface IShim {
|
||||
IOrchardHostContainer HostContainer { get; set;}
|
||||
}
|
||||
}
|
37
src/Orchard/Environment/OrchardHostContainerRegistry.cs
Normal file
37
src/Orchard/Environment/OrchardHostContainerRegistry.cs
Normal file
@@ -0,0 +1,37 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.Environment {
|
||||
/// <summary>
|
||||
/// Provides ability to connect Shims and the OrchardHostContainer
|
||||
/// </summary>
|
||||
public static class OrchardHostContainerRegistry {
|
||||
private static readonly IList<IShim> _shims = new List<IShim>();
|
||||
private static IOrchardHostContainer _hostContainer;
|
||||
|
||||
public static void RegisterShim(IShim shim) {
|
||||
_shims.Add(shim);
|
||||
shim.HostContainer = _hostContainer;
|
||||
}
|
||||
|
||||
public static void RegisterHostContainer(IOrchardHostContainer container) {
|
||||
if (object.ReferenceEquals(_hostContainer, container))
|
||||
return;
|
||||
|
||||
UnregisterContainerShims();
|
||||
_hostContainer = container;
|
||||
RegisterContainerInShims();
|
||||
}
|
||||
|
||||
private static void UnregisterContainerShims() {
|
||||
foreach (var shim in _shims) {
|
||||
shim.HostContainer = null;
|
||||
}
|
||||
}
|
||||
|
||||
private static void RegisterContainerInShims() {
|
||||
foreach (var shim in _shims) {
|
||||
shim.HostContainer = _hostContainer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -9,6 +9,7 @@ using Orchard.Caching;
|
||||
using Orchard.Environment.AutofacUtil;
|
||||
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;
|
||||
@@ -37,6 +38,8 @@ namespace Orchard.Environment {
|
||||
builder.RegisterType<DefaultBuildManager>().As<IBuildManager>().SingleInstance();
|
||||
builder.RegisterType<WebFormsExtensionsVirtualPathProvider>().As<ICustomVirtualPathProvider>().SingleInstance();
|
||||
builder.RegisterType<AppDataFolderRoot>().As<IAppDataFolderRoot>().SingleInstance();
|
||||
builder.RegisterType<DefaultExtensionCompiler>().As<IExtensionCompiler>().SingleInstance();
|
||||
builder.RegisterType<DefaultProjectFileParser>().As<IProjectFileParser>().SingleInstance();
|
||||
|
||||
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);
|
||||
RegisterVolatileProvider<AppDataFolder, IAppDataFolder>(builder);
|
||||
@@ -134,6 +137,7 @@ namespace Orchard.Environment {
|
||||
}
|
||||
}
|
||||
|
||||
OrchardHostContainerRegistry.RegisterHostContainer(new DefaultOrchardHostContainer(container));
|
||||
return container.Resolve<IOrchardHost>();
|
||||
}
|
||||
}
|
||||
|
@@ -1,16 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Orchard.Environment {
|
||||
public static class ServiceLocator {
|
||||
private static Func<Type, object> _locator;
|
||||
|
||||
public static void SetLocator(Func<Type, object> locator) {
|
||||
_locator = locator;
|
||||
}
|
||||
|
||||
public static T Resolve<T>() {
|
||||
return (T)_locator(typeof(T));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -353,6 +353,14 @@
|
||||
<Compile Include="Data\ISessionLocator.cs" />
|
||||
<Compile Include="Data\DataModule.cs" />
|
||||
<Compile Include="Data\Orderable.cs" />
|
||||
<Compile Include="Environment\DefaultHostContainer.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\CompileExtensionContext.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\CSharpExtensionBuildProviderShim.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\ProjectFileDescriptor.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\IProjectFileParser.cs" />
|
||||
<Compile Include="Environment\IOrchardHostContainer.cs" />
|
||||
<Compile Include="Environment\IShim.cs" />
|
||||
<Compile Include="Environment\OrchardHostContainerRegistry.cs" />
|
||||
<Compile Include="Environment\DefaultOrchardShell.cs" />
|
||||
<Compile Include="Environment\Extensions\ExtensionLoaderCoordinator.cs" />
|
||||
<Compile Include="Environment\Extensions\ExtensionLoadingContext.cs" />
|
||||
@@ -371,11 +379,11 @@
|
||||
<Compile Include="FileSystems\VirtualPath\IVirtualPathMonitor.cs" />
|
||||
<Compile Include="FileSystems\Dependencies\IDependenciesFolder.cs" />
|
||||
<Compile Include="Environment\Extensions\Loaders\ProbingExtensionLoader.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\CSharpExtensionBuildProvider.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\CSharpExtensionCompiler.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\CSharpProjectMediumTrustCompiler.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\IExtensionCompiler.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\CSharpExtensionDirectoryCompiler.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\DefaultExtensionCompiler.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\CSharpProjectFullTrustCompiler.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\CSharpProjectParser.cs" />
|
||||
<Compile Include="Environment\Extensions\Compilers\DefaultProjectFileParser.cs" />
|
||||
<Compile Include="Environment\IAssemblyBuilder.cs" />
|
||||
<Compile Include="Environment\IBuildManager.cs" />
|
||||
<Compile Include="FileSystems\VirtualPath\IVirtualPathProvider.cs" />
|
||||
@@ -560,7 +568,6 @@
|
||||
<Compile Include="Localization\Localizer.cs" />
|
||||
<Compile Include="Localization\LocalizedString.cs" />
|
||||
<Compile Include="Localization\NullLocalizer.cs" />
|
||||
<Compile Include="Environment\ServiceLocator.cs" />
|
||||
<Compile Include="Logging\CastleLogger.cs" />
|
||||
<Compile Include="Logging\CastleLoggerFactory.cs" />
|
||||
<Compile Include="Logging\ILogger.cs" />
|
||||
|
@@ -6,7 +6,7 @@ namespace Orchard.Security.Providers {
|
||||
public class OrchardMembershipProvider : MembershipProvider {
|
||||
|
||||
static IMembershipService GetService() {
|
||||
return ServiceLocator.Resolve<IMembershipService>();
|
||||
throw new NotImplementedException("The OrchardMemberShipProvider is not supported anymore. Use the IMembershipService interface instead.");
|
||||
}
|
||||
|
||||
static MembershipSettings GetSettings() {
|
||||
|
Reference in New Issue
Block a user