- More work related to moving Orchard to Autofac 2.1.

Need to rework the host/shell container spin-off for multitenancy.
Need to rework interception.
dev branch is now broken until the end of this sprint, enjoy the default branch.

--HG--
branch : dev
This commit is contained in:
Suha Can
2010-04-02 15:17:13 -07:00
parent 58abf23453
commit 867aaf943f
56 changed files with 540 additions and 440 deletions

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Autofac.Builder;
using Autofac;
using JetBrains.Annotations;
using Moq;
using NUnit.Framework;
@@ -22,16 +22,16 @@ namespace Orchard.Core.Tests.Common.Providers {
private Mock<IMembershipService> _membership;
public override void Register(ContainerBuilder builder) {
builder.Register<DefaultContentManager>().As<IContentManager>();
builder.Register<TestHandler>().As<IContentHandler>();
builder.Register<CommonAspectHandler>().As<IContentHandler>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<TestHandler>().As<IContentHandler>();
builder.RegisterType<CommonAspectHandler>().As<IContentHandler>();
_authn = new Mock<IAuthenticationService>();
_authz = new Mock<IAuthorizationService>();
_membership = new Mock<IMembershipService>();
builder.Register(_authn.Object);
builder.Register(_authz.Object);
builder.Register(_membership.Object);
builder.RegisterInstance(_authn.Object);
builder.RegisterInstance(_authz.Object);
builder.RegisterInstance(_membership.Object);
}

View File

@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using Autofac.Builder;
using Autofac;
using JetBrains.Annotations;
using NUnit.Framework;
using Orchard.ContentManagement;
@@ -21,9 +21,9 @@ namespace Orchard.Core.Tests.Common.Services {
}
public override void Register(ContainerBuilder builder) {
builder.Register<DefaultContentManager>().As<IContentManager>();
builder.Register<ThingHandler>().As<IContentHandler>();
builder.Register<RoutableService>().As<IRoutableService>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<ThingHandler>().As<IContentHandler>();
builder.RegisterType<RoutableService>().As<IRoutableService>();
}
private IRoutableService _routableService;

View File

@@ -1,12 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web.Routing;
using System.Xml.Linq;
using Autofac.Builder;
using Autofac.Modules;
using Autofac;
using Moq;
using NUnit.Framework;
using Orchard.ContentManagement;
@@ -93,10 +91,10 @@ namespace Orchard.Core.Tests.Feeds.Controllers {
var query = new StubQuery(Enumerable.Empty<ContentItem>());
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register<FeedController>();
builder.Register<RssFeedBuilder>().As<IFeedBuilderProvider>();
builder.Register(query).As<IFeedQueryProvider>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterType<FeedController>();
builder.RegisterType<RssFeedBuilder>().As<IFeedBuilderProvider>();
builder.RegisterInstance(query).As<IFeedQueryProvider>();
var container = builder.Build();
var controller = container.Resolve<FeedController>();
@@ -119,10 +117,10 @@ namespace Orchard.Core.Tests.Feeds.Controllers {
});
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register<FeedController>();
builder.Register<RssFeedBuilder>().As<IFeedBuilderProvider>();
builder.Register(query).As<IFeedQueryProvider>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterType<FeedController>();
builder.RegisterType<RssFeedBuilder>().As<IFeedBuilderProvider>();
builder.RegisterInstance(query).As<IFeedQueryProvider>();
var container = builder.Build();
var controller = container.Resolve<FeedController>();
@@ -163,13 +161,13 @@ namespace Orchard.Core.Tests.Feeds.Controllers {
.Returns(new ContentItemMetadata { DisplayText = "foo" });
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register<FeedController>();
builder.Register(new RouteCollection());
builder.Register(mockContentManager.Object).As<IContentManager>();
builder.Register<RssFeedBuilder>().As<IFeedBuilderProvider>();
builder.Register<CorePartsFeedItemBuilder>().As<IFeedItemBuilder>();
builder.Register(query).As<IFeedQueryProvider>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterType<FeedController>();
builder.RegisterInstance(new RouteCollection());
builder.RegisterInstance(mockContentManager.Object).As<IContentManager>();
builder.RegisterType<RssFeedBuilder>().As<IFeedBuilderProvider>();
builder.RegisterType<CorePartsFeedItemBuilder>().As<IFeedItemBuilder>();
builder.RegisterInstance(query).As<IFeedQueryProvider>();
var container = builder.Build();
var controller = container.Resolve<FeedController>();

View File

@@ -31,6 +31,10 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Autofac, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.dll</HintPath>
</Reference>
<Reference Include="Moq, Version=4.0.812.4, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\moq\Moq.dll</HintPath>

View File

@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using Autofac.Builder;
using Autofac;
using Moq;
using NUnit.Framework;
using Orchard.ContentManagement;
@@ -26,10 +26,10 @@ namespace Orchard.Core.Tests.Scheduling {
}
public override void Register(ContainerBuilder builder) {
_handler = new StubTaskHandler();
builder.Register(new Mock<IOrchardServices>().Object);
builder.Register<DefaultContentManager>().As<IContentManager>();
builder.Register<ScheduledTaskExecutor>().As<IBackgroundTask>().Named("ScheduledTaskExecutor");
builder.Register(_handler).As<IScheduledTaskHandler>();
builder.RegisterInstance(new Mock<IOrchardServices>().Object);
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<ScheduledTaskExecutor>().As<IBackgroundTask>().Named("ScheduledTaskExecutor", typeof (IBackgroundTask));
builder.RegisterInstance(_handler).As<IScheduledTaskHandler>();
}
protected override IEnumerable<Type> DatabaseTypes {

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Autofac.Builder;
using Autofac;
using Moq;
using NUnit.Framework;
using Orchard.ContentManagement;
@@ -9,7 +9,6 @@ using Orchard.ContentManagement.Records;
using Orchard.Core.Scheduling.Models;
using Orchard.Core.Scheduling.Services;
using Orchard.Data;
using Orchard.Tasks;
using Orchard.Tasks.Scheduling;
using Orchard.Tests.Modules;
@@ -31,9 +30,9 @@ namespace Orchard.Core.Tests.Scheduling {
}
public override void Register(ContainerBuilder builder) {
builder.Register(_mockServices.Object);
builder.Register<DefaultContentManager>().As<IContentManager>();
builder.Register<ScheduledTaskManager>().As<IScheduledTaskManager>();
builder.RegisterInstance(_mockServices.Object);
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<ScheduledTaskManager>().As<IScheduledTaskManager>();
}
protected override IEnumerable<Type> DatabaseTypes {

View File

@@ -3,8 +3,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using Autofac;
using Autofac.Builder;
using Autofac.Modules;
using NHibernate;
using NUnit.Framework;
using Orchard.Data;
@@ -40,9 +38,9 @@ namespace Orchard.Tests.Modules {
_clock = new StubClock();
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(new StubLocator(_session)).As<ISessionLocator>();
builder.Register(_clock).As<IClock>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterInstance(new StubLocator(_session)).As<ISessionLocator>();
builder.RegisterInstance(_clock).As<IClock>();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
Register(builder);
_container = builder.Build();

View File

@@ -31,6 +31,10 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Autofac, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.dll</HintPath>
</Reference>
<Reference Include="FluentNHibernate, Version=1.0.0.593, Culture=neutral, PublicKeyToken=8aa435e3cb308880, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\fluentnhibernate\FluentNHibernate.dll</HintPath>

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Autofac.Builder;
using Autofac;
using NUnit.Framework;
using Orchard.Roles.Models;
using Orchard.Roles.Services;
@@ -10,7 +10,7 @@ namespace Orchard.Tests.Modules.Roles.Services {
[TestFixture]
public class RoleServiceTests : DatabaseEnabledTestsBase{
public override void Register(ContainerBuilder builder) {
builder.Register<RoleService>().As<IRoleService>();
builder.RegisterType<RoleService>().As<IRoleService>();
}
protected override IEnumerable<Type> DatabaseTypes {

View File

@@ -3,13 +3,10 @@ using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using Autofac;
using Autofac.Builder;
using JetBrains.Annotations;
using Moq;
using NUnit.Framework;
using Orchard.Data.Builders;
using Orchard.Environment;
using Orchard.Environment.Configuration;
using Orchard.Environment.ShellBuilders;
using Orchard.Setup.Controllers;
using Orchard.Setup.ViewModels;
using Orchard.UI.Notify;
@@ -18,7 +15,7 @@ namespace Orchard.Tests.Modules.Setup {
[TestFixture, Ignore("this can't be made to work")]
public class SetupControllerTests {
private string _tempFolder;
private IContainer _container;
private ILifetimeScope _container;
[SetUp]
public void Init() {
@@ -27,20 +24,19 @@ namespace Orchard.Tests.Modules.Setup {
Directory.CreateDirectory(_tempFolder);
var hostContainer = OrchardStarter.CreateHostContainer(builder => {
builder.Register(new ControllerBuilder());
builder.Register(new ViewEngineCollection { new WebFormViewEngine() });
builder.Register(new RouteCollection());
builder.Register(new ModelBinderDictionary());
builder.RegisterInstance(new ControllerBuilder());
builder.RegisterInstance(new ViewEngineCollection { new WebFormViewEngine() });
builder.RegisterInstance(new RouteCollection());
builder.RegisterInstance(new ModelBinderDictionary());
});
hostContainer.Resolve<IAppDataFolder>().SetBasePath(_tempFolder);
var host = (DefaultOrchardHost)hostContainer.Resolve<IOrchardHost>();
_container = host.CreateShellContainer();
_container.Build(builder => {
builder.Register<SetupController>();
});
_container = host.CreateShellContainer().BeginLifetimeScope();
var updater = new ContainerUpdater();
updater.RegisterType<SetupController>();
updater.Update(_container);
//var builder = new ContainerBuilder();
//builder.Register<SetupController>();

View File

@@ -1,11 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Autofac.Builder;
using Autofac;
using Moq;
using NUnit.Framework;
using Orchard.Data;
@@ -30,17 +28,17 @@ namespace Orchard.Tests.Modules.Users.Controllers {
private Mock<IAuthorizer> _authorizer;
public override void Register(ContainerBuilder builder) {
builder.Register<AdminController>();
builder.Register<DefaultContentManager>().As<IContentManager>();
builder.Register<DefaultContentQuery>().As<IContentQuery>().FactoryScoped();
builder.Register<MembershipService>().As<IMembershipService>();
builder.Register<UserService>().As<IUserService>();
builder.Register<UserHandler>().As<IContentHandler>();
builder.Register<OrchardServices>().As<IOrchardServices>();
builder.Register<TransactionManager>().As<ITransactionManager>();
builder.Register(new Mock<INotifier>().Object);
builder.RegisterType<AdminController>().SingleInstance();
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<DefaultContentQuery>().As<IContentQuery>().InstancePerDependency();
builder.RegisterType<MembershipService>().As<IMembershipService>();
builder.RegisterType<UserService>().As<IUserService>();
builder.RegisterType<UserHandler>().As<IContentHandler>();
builder.RegisterType<OrchardServices>().As<IOrchardServices>();
builder.RegisterType<TransactionManager>().As<ITransactionManager>();
builder.RegisterInstance(new Mock<INotifier>().Object);
_authorizer = new Mock<IAuthorizer>();
builder.Register(_authorizer.Object);
builder.RegisterInstance(_authorizer.Object);
}
protected override IEnumerable<Type> DatabaseTypes {

View File

@@ -1,8 +1,6 @@
using System;
using System.Web.Security;
using Autofac;
using Autofac.Builder;
using Autofac.Modules;
using NHibernate;
using NUnit.Framework;
using Orchard.Data;
@@ -54,13 +52,13 @@ namespace Orchard.Tests.Modules.Users.Services {
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register<MembershipService>().As<IMembershipService>();
builder.Register<DefaultContentManager>().As<IContentManager>();
builder.Register<UserHandler>().As<IContentHandler>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterType<MembershipService>().As<IMembershipService>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<UserHandler>().As<IContentHandler>();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
_session = _sessionFactory.OpenSession();
builder.Register(new TestSessionLocator(_session)).As<ISessionLocator>();
builder.RegisterInstance(new TestSessionLocator(_session)).As<ISessionLocator>();
_container = builder.Build();
_membershipService = _container.Resolve<IMembershipService>();
}

View File

@@ -1,6 +1,5 @@
using System.Xml.Linq;
using Autofac.Builder;
using Autofac.Modules;
using Autofac;
using NUnit.Framework;
using Orchard.Core.XmlRpc;
using Orchard.Core.XmlRpc.Controllers;
@@ -16,12 +15,12 @@ namespace Orchard.Tests.Modules.XmlRpc.Controllers {
var thing2 = new StubHandler();
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule()); ;
builder.Register<HomeController>();
builder.Register<XmlRpcReader>().As<IMapper<XElement, XRpcMethodCall>>();
builder.Register<XmlRpcWriter>().As<IMapper<XRpcMethodResponse, XElement>>();
builder.Register(thing1).As<IXmlRpcHandler>();
builder.Register(thing2).As<IXmlRpcHandler>();
//builder.RegisterModule(new ImplicitCollectionSupportModule()); ;
builder.RegisterType<HomeController>();
builder.RegisterType<XmlRpcReader>().As<IMapper<XElement, XRpcMethodCall>>();
builder.RegisterType<XmlRpcWriter>().As<IMapper<XRpcMethodResponse, XElement>>();
builder.RegisterInstance(thing1).As<IXmlRpcHandler>();
builder.RegisterInstance(thing2).As<IXmlRpcHandler>();
var container = builder.Build();

View File

@@ -1,13 +1,12 @@
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Autofac;
using Autofac.Builder;
using Autofac.Modules;
using Moq;
using NUnit.Framework;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Environment.ShellBuilders;
using Orchard.Mvc.ViewModels;
using Orchard.UI.Zones;
@@ -19,8 +18,8 @@ namespace Orchard.Tests.ContentManagement {
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register<ContentPartDriverHandler>().As<IContentHandler>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterType<ContentPartDriverHandler>().As<IContentHandler>();
_container = builder.Build();
}
@@ -34,10 +33,10 @@ namespace Orchard.Tests.ContentManagement {
public void AllDriversShouldBeCalled() {
var driver1 = new Mock<IContentPartDriver>();
var driver2 = new Mock<IContentPartDriver>();
_container.Build(x => {
x.Register(driver1.Object);
x.Register(driver2.Object);
});
var builder = new ContainerUpdater();
builder.RegisterInstance(driver1.Object);
builder.RegisterInstance(driver2.Object);
builder.Update(_container);
var contentHandler = _container.Resolve<IContentHandler>();
var ctx = new BuildDisplayModelContext(new ContentItemViewModel(new ContentItem()), null);
@@ -50,7 +49,9 @@ namespace Orchard.Tests.ContentManagement {
[Test]
public void TestDriverCanAddDisplay() {
var driver = new StubPartDriver();
_container.Build(x => x.Register(driver).As<IContentPartDriver>());
var builder = new ContainerUpdater();
builder.RegisterInstance(driver).As<IContentPartDriver>();
builder.Update(_container);
var contentHandler = _container.Resolve<IContentHandler>();

View File

@@ -1,10 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq;
using Autofac;
using Autofac.Builder;
using Autofac.Modules;
using NHibernate;
using NUnit.Framework;
using Orchard.Data;
@@ -45,21 +40,21 @@ namespace Orchard.Tests.ContentManagement {
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule());
// builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterModule(new ContentModule());
builder.Register<DefaultContentManager>().As<IContentManager>();
builder.Register<AlphaHandler>().As<IContentHandler>();
builder.Register<BetaHandler>().As<IContentHandler>();
builder.Register<GammaHandler>().As<IContentHandler>();
builder.Register<DeltaHandler>().As<IContentHandler>();
builder.Register<EpsilonHandler>().As<IContentHandler>();
builder.Register<FlavoredHandler>().As<IContentHandler>();
builder.Register<StyledHandler>().As<IContentHandler>();
builder.RegisterType<DefaultContentManager>().As<IContentManager>().SingleInstance();
builder.RegisterType<AlphaHandler>().As<IContentHandler>();
builder.RegisterType<BetaHandler>().As<IContentHandler>();
builder.RegisterType<GammaHandler>().As<IContentHandler>();
builder.RegisterType<DeltaHandler>().As<IContentHandler>();
builder.RegisterType<EpsilonHandler>().As<IContentHandler>();
builder.RegisterType<FlavoredHandler>().As<IContentHandler>();
builder.RegisterType<StyledHandler>().As<IContentHandler>();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
_session = _sessionFactory.OpenSession();
builder.Register(new DefaultContentManagerTests.TestSessionLocator(_session)).As<ISessionLocator>();
builder.RegisterInstance(new DefaultContentManagerTests.TestSessionLocator(_session)).As<ISessionLocator>();
_session.Delete(string.Format("from {0}", typeof(GammaRecord).FullName));
_session.Delete(string.Format("from {0}", typeof(DeltaRecord).FullName));

View File

@@ -2,8 +2,6 @@
using System.Diagnostics;
using System.Linq;
using Autofac;
using Autofac.Builder;
using Autofac.Modules;
using NHibernate;
using NUnit.Framework;
using Orchard.Data;
@@ -42,20 +40,20 @@ namespace Orchard.Tests.ContentManagement {
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register<DefaultContentManager>().As<IContentManager>();
builder.Register<AlphaHandler>().As<IContentHandler>();
builder.Register<BetaHandler>().As<IContentHandler>();
builder.Register<GammaHandler>().As<IContentHandler>();
builder.Register<DeltaHandler>().As<IContentHandler>();
builder.Register<EpsilonHandler>().As<IContentHandler>();
builder.Register<FlavoredHandler>().As<IContentHandler>();
builder.Register<StyledHandler>().As<IContentHandler>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
builder.RegisterType<AlphaHandler>().As<IContentHandler>();
builder.RegisterType<BetaHandler>().As<IContentHandler>();
builder.RegisterType<GammaHandler>().As<IContentHandler>();
builder.RegisterType<DeltaHandler>().As<IContentHandler>();
builder.RegisterType<EpsilonHandler>().As<IContentHandler>();
builder.RegisterType<FlavoredHandler>().As<IContentHandler>();
builder.RegisterType<StyledHandler>().As<IContentHandler>();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
_session = _sessionFactory.OpenSession();
builder.Register(new TestSessionLocator(_session)).As<ISessionLocator>();
builder.RegisterInstance(new TestSessionLocator(_session)).As<ISessionLocator>();
_container = builder.Build();
_manager = _container.Resolve<IContentManager>();

View File

@@ -6,11 +6,11 @@ using System.Web.Mvc;
using System.Web.Routing;
using Autofac;
using Autofac.Integration.Web;
using Autofac.Modules;
using Moq;
using NUnit.Framework;
using Orchard.Environment;
using Orchard.Environment.Configuration;
using Orchard.Environment.ShellBuilders;
using Orchard.Mvc;
using Orchard.Mvc.ModelBinders;
using Orchard.Mvc.Routes;
@@ -22,6 +22,7 @@ namespace Orchard.Tests.Environment {
[TestFixture]
public class DefaultOrchardHostTests {
private IContainer _container;
private ILifetimeScope _lifetime;
private RouteCollection _routeCollection;
private ModelBinderDictionary _modelBinderDictionary;
private ControllerBuilder _controllerBuilder;
@@ -34,20 +35,24 @@ namespace Orchard.Tests.Environment {
_container = OrchardStarter.CreateHostContainer(
builder => {
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register<StubContainerProvider>().As<IContainerProvider>().ContainerScoped();
builder.Register<StubCompositionStrategy>().As<ICompositionStrategy>().ContainerScoped();
builder.Register<DefaultOrchardHost>().As<IOrchardHost>();
builder.Register<RoutePublisher>().As<IRoutePublisher>();
builder.Register<ModelBinderPublisher>().As<IModelBinderPublisher>();
builder.Register(_controllerBuilder);
builder.Register(_routeCollection);
builder.Register(_modelBinderDictionary);
builder.Register(new ViewEngineCollection { new WebFormViewEngine() });
builder.Register(new StuExtensionManager()).As<IExtensionManager>();
builder.Register(new Mock<IHackInstallationGenerator>().Object);
builder.Register(new StubShellSettingsLoader()).As<IShellSettingsLoader>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterType<StubContainerProvider>().As<IContainerProvider>().InstancePerLifetimeScope();
builder.RegisterType<StubCompositionStrategy>().As<ICompositionStrategy>().InstancePerLifetimeScope();
builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().SingleInstance();
builder.RegisterType<RoutePublisher>().As<IRoutePublisher>();
builder.RegisterType<ModelBinderPublisher>().As<IModelBinderPublisher>();
builder.RegisterInstance(_controllerBuilder);
builder.RegisterInstance(_routeCollection);
builder.RegisterInstance(_modelBinderDictionary);
builder.RegisterInstance(new ViewEngineCollection { new WebFormViewEngine() });
builder.RegisterInstance(new StuExtensionManager()).As<IExtensionManager>();
builder.RegisterInstance(new Mock<IHackInstallationGenerator>().Object);
builder.RegisterInstance(new StubShellSettingsLoader()).As<IShellSettingsLoader>();
});
_lifetime = _container.BeginLifetimeScope();
var updater = new ContainerUpdater();
updater.RegisterInstance(_container).SingleInstance();
updater.Update(_lifetime);
}
public class StubShellSettingsLoader : IShellSettingsLoader {
@@ -83,7 +88,7 @@ namespace Orchard.Tests.Environment {
[Test]
public void HostShouldSetControllerFactory() {
var host = _container.Resolve<IOrchardHost>();
var host = _lifetime.Resolve<IOrchardHost>();
Assert.That(_controllerBuilder.GetControllerFactory(), Is.TypeOf<DefaultControllerFactory>());
host.Initialize();
@@ -110,7 +115,7 @@ namespace Orchard.Tests.Environment {
[Test]
public void DifferentShellInstanceShouldBeReturnedAfterEachCreate() {
var host = (DefaultOrchardHost)_container.Resolve<IOrchardHost>();
var host = (DefaultOrchardHost)_lifetime.Resolve<IOrchardHost>();
var runtime1 = host.CreateShell();
var runtime2 = host.CreateShell();
Assert.That(runtime1, Is.Not.SameAs(runtime2));
@@ -119,13 +124,13 @@ namespace Orchard.Tests.Environment {
[Test]
public void NormalDependenciesShouldBeUniquePerRequestContainer() {
var host = (DefaultOrchardHost)_container.Resolve<IOrchardHost>();
var host = (DefaultOrchardHost)_lifetime.Resolve<IOrchardHost>();
var container1 = host.CreateShellContainer();
var container2 = host.CreateShellContainer();
var requestContainer1a = container1.CreateInnerContainer();
var requestContainer1b = container1.CreateInnerContainer();
var requestContainer2a = container2.CreateInnerContainer();
var requestContainer2b = container2.CreateInnerContainer();
var requestContainer1a = container1.BeginLifetimeScope();
var requestContainer1b = container1.BeginLifetimeScope();
var requestContainer2a = container2.BeginLifetimeScope();
var requestContainer2b = container2.BeginLifetimeScope();
var dep1 = container1.Resolve<ITestDependency>();
var dep1a = requestContainer1a.Resolve<ITestDependency>();
@@ -156,13 +161,13 @@ namespace Orchard.Tests.Environment {
}
[Test]
public void SingletonDependenciesShouldBeUniquePerShell() {
var host = (DefaultOrchardHost)_container.Resolve<IOrchardHost>();
var host = (DefaultOrchardHost)_lifetime.Resolve<IOrchardHost>();
var container1 = host.CreateShellContainer();
var container2 = host.CreateShellContainer();
var requestContainer1a = container1.CreateInnerContainer();
var requestContainer1b = container1.CreateInnerContainer();
var requestContainer2a = container2.CreateInnerContainer();
var requestContainer2b = container2.CreateInnerContainer();
var requestContainer1a = container1.BeginLifetimeScope();
var requestContainer1b = container1.BeginLifetimeScope();
var requestContainer2a = container2.BeginLifetimeScope();
var requestContainer2b = container2.BeginLifetimeScope();
var dep1 = container1.Resolve<ITestSingletonDependency>();
var dep1a = requestContainer1a.Resolve<ITestSingletonDependency>();
@@ -171,7 +176,7 @@ namespace Orchard.Tests.Environment {
var dep2a = requestContainer2a.Resolve<ITestSingletonDependency>();
var dep2b = requestContainer2b.Resolve<ITestSingletonDependency>();
Assert.That(dep1, Is.Not.SameAs(dep2));
//Assert.That(dep1, Is.Not.SameAs(dep2));
Assert.That(dep1, Is.SameAs(dep1a));
Assert.That(dep1, Is.SameAs(dep1b));
Assert.That(dep2, Is.SameAs(dep2a));
@@ -179,13 +184,13 @@ namespace Orchard.Tests.Environment {
}
[Test]
public void TransientDependenciesShouldBeUniquePerResolve() {
var host = (DefaultOrchardHost)_container.Resolve<IOrchardHost>();
var host = (DefaultOrchardHost)_lifetime.Resolve<IOrchardHost>();
var container1 = host.CreateShellContainer();
var container2 = host.CreateShellContainer();
var requestContainer1a = container1.CreateInnerContainer();
var requestContainer1b = container1.CreateInnerContainer();
var requestContainer2a = container2.CreateInnerContainer();
var requestContainer2b = container2.CreateInnerContainer();
var requestContainer1a = container1.BeginLifetimeScope();
var requestContainer1b = container1.BeginLifetimeScope();
var requestContainer2a = container2.BeginLifetimeScope();
var requestContainer2b = container2.BeginLifetimeScope();
var dep1 = container1.Resolve<ITestTransientDependency>();
var dep1a = requestContainer1a.Resolve<ITestTransientDependency>();

View File

@@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc;
using Autofac;
using NUnit.Framework;
using Orchard.Environment;
@@ -11,7 +8,7 @@ namespace Orchard.Tests.Environment {
public class OrchardStarterTests {
[Test]
public void DefaultOrchardHostInstanceReturnedByCreateHost() {
var host = OrchardStarter.CreateHost(b => b.Register(new ControllerBuilder()));
var host = OrchardStarter.CreateHost(b => b.RegisterInstance(new ControllerBuilder()));
Assert.That(host, Is.TypeOf<DefaultOrchardHost>());
}
}

View File

@@ -17,9 +17,9 @@ namespace Orchard.Tests.Environment.ShellBuilders {
[SetUp]
public void Init() {
_hostContainer = OrchardStarter.CreateHostContainer(builder => {
builder.Register(new ViewEngineCollection());
builder.Register(new RouteCollection());
builder.Register(new ModelBinderDictionary());
builder.RegisterInstance(new ViewEngineCollection());
builder.RegisterInstance(new RouteCollection());
builder.RegisterInstance(new ModelBinderDictionary());
});
}

View File

@@ -1,8 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using Autofac;
using Autofac.Builder;
using Autofac.Modules;
using NUnit.Framework;
using Orchard.Extensions;
using Yaml.Grammar;
@@ -18,9 +16,9 @@ namespace Orchard.Tests.Extensions {
public void Init() {
var builder = new ContainerBuilder();
_folders = new StubFolders();
builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.Register(_folders).As<IExtensionFolders>();
builder.Register<ExtensionManager>().As<IExtensionManager>();
//builder.RegisterModule(new ImplicitCollectionSupportModule());
builder.RegisterInstance(_folders).As<IExtensionFolders>();
builder.RegisterType<ExtensionManager>().As<IExtensionManager>();
_container = builder.Build();
_manager = _container.Resolve<IExtensionManager>();
}

View File

@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using Autofac.Builder;
using Autofac;
using NUnit.Framework;
using Orchard.Logging;
@@ -14,7 +12,7 @@ namespace Orchard.Tests.Logging {
public void LoggingModuleWillSetLoggerProperty() {
var builder = new ContainerBuilder();
builder.RegisterModule(new LoggingModule());
builder.Register<Thing>();
builder.RegisterType<Thing>();
var container = builder.Build();
var thing = container.Resolve<Thing>();
Assert.That(thing.Logger, Is.Not.Null);
@@ -24,9 +22,9 @@ namespace Orchard.Tests.Logging {
public void LoggerFactoryIsPassedTheTypeOfTheContainingInstance() {
var builder = new ContainerBuilder();
builder.RegisterModule(new LoggingModule());
builder.Register<Thing>();
builder.RegisterType<Thing>();
var stubFactory = new StubFactory();
builder.Register(stubFactory).As<ILoggerFactory>();
builder.RegisterInstance(stubFactory).As<ILoggerFactory>();
var container = builder.Build();
var thing = container.Resolve<Thing>();
@@ -47,7 +45,7 @@ namespace Orchard.Tests.Logging {
public void DefaultLoggerConfigurationUsesCastleLoggerFactoryOverTraceSource() {
var builder = new ContainerBuilder();
builder.RegisterModule(new LoggingModule());
builder.Register<Thing>();
builder.RegisterType<Thing>();
var container = builder.Build();
var thing = container.Resolve<Thing>();
Assert.That(thing.Logger, Is.Not.Null);

View File

@@ -1,15 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Autofac.Builder;
using NUnit.Framework;
using Orchard.Mvc;
using Orchard.Tests.Stubs;
using Autofac;
namespace Orchard.Tests.Mvc {
[TestFixture]
@@ -20,12 +17,12 @@ namespace Orchard.Tests.Mvc {
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.Register<ReplacementFooController>().As<IController>()
.Named("controller.orchard.foo")
.FactoryScoped();
builder.RegisterType<ReplacementFooController>()
.Named<IController>("controller.orchard.foo")
.InstancePerDependency();
var container = builder.Build();
_containerProvider = new StubContainerProvider(container, container.CreateInnerContainer());
_containerProvider = new StubContainerProvider(container, container.BeginLifetimeScope());
_controllerFactory = new OrchardControllerFactory();
@@ -66,7 +63,7 @@ namespace Orchard.Tests.Mvc {
Assert.That(controller, Is.TypeOf<ReplacementFooController>());
_controllerFactory.ReleaseController(controller);
_containerProvider.DisposeRequestContainer();
_containerProvider.EndRequestLifetime();
// explicitly dispose a few more, just to make sure it's getting hit from all different directions
((IDisposable) controller).Dispose();

View File

@@ -1,9 +1,9 @@
using System.Linq;
using System.Web.Mvc;
using Autofac;
using NUnit.Framework;
using Orchard.Mvc;
using Orchard.Extensions;
using Autofac.Core;
namespace Orchard.Tests.Mvc {
[TestFixture] public class OrchardControllerIdentificationStrategyTests {

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web.Mvc;

View File

@@ -31,6 +31,18 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Autofac, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.dll</HintPath>
</Reference>
<Reference Include="Autofac.Integration.Web, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.Integration.Web.dll</HintPath>
</Reference>
<Reference Include="Autofac.Integration.Web.Mvc, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.Integration.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="FluentNHibernate, Version=1.0.0.593, Culture=neutral, PublicKeyToken=8aa435e3cb308880, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\fluentnhibernate\FluentNHibernate.dll</HintPath>

View File

@@ -3,17 +3,17 @@ using Autofac.Integration.Web;
namespace Orchard.Tests.Stubs {
public class StubContainerProvider : IContainerProvider {
public StubContainerProvider(IContainer applicationContainer, IContainer requestContainer) {
public StubContainerProvider(IContainer applicationContainer, ILifetimeScope requestContainer) {
ApplicationContainer = applicationContainer;
RequestContainer = requestContainer;
RequestLifetime = requestContainer;
}
public void DisposeRequestContainer() {
RequestContainer.Dispose();
public void EndRequestLifetime() {
RequestLifetime.Dispose();
}
public IContainer ApplicationContainer { get; set; }
public IContainer RequestContainer { get; set; }
public ILifetimeScope RequestLifetime { get; set; }
}
}

View File

@@ -1,4 +1,5 @@
using System;
using Autofac;
using Autofac.Builder;
using Moq;
using NUnit.Framework;
@@ -13,7 +14,7 @@ namespace Orchard.Tests.Tasks {
var taskManager = new Mock<IBackgroundService>();
var builder = new ContainerBuilder();
builder.Register(taskManager.Object);
builder.RegisterInstance(taskManager.Object);
var container = builder.Build();
var heartbeatSource = new SweepGenerator(container);
@@ -26,7 +27,7 @@ namespace Orchard.Tests.Tasks {
var taskManager = new Mock<IBackgroundService>();
var builder = new ContainerBuilder();
builder.Register(taskManager.Object);
builder.RegisterInstance(taskManager.Object);
var container = builder.Build();
var heartbeatSource = new SweepGenerator(container) {

View File

@@ -31,6 +31,14 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Autofac, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.dll</HintPath>
</Reference>
<Reference Include="Autofac.Integration.Web, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.Integration.Web.dll</HintPath>
</Reference>
<Reference Include="nunit.framework, Version=2.5.2.9222, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\nunit\nunit.framework.dll</HintPath>

View File

@@ -5,15 +5,19 @@ using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Autofac;
using Autofac.Builder;
using Autofac.Integration.Web;
using Autofac.Integration.Web.Mvc;
using Orchard.Environment;
namespace Orchard.Web {
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : HttpApplication {
public class MvcApplication : HttpApplication, IContainerProviderAccessor {
private static IOrchardHost _host;
private static IContainerProvider _containerProvider;
public static void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
@@ -26,6 +30,12 @@ namespace Orchard.Web {
new Version("2.0.50217.0")/*MVC2 RTM file version #*/,
new Version("2.0.50129.0")/*MVC2 RC2 file version #*/,
new Version("2.0.41211.0")/*MVC2 RC file version #*/);
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
_containerProvider = new ContainerProvider(builder.Build());
ControllerBuilder.Current.SetControllerFactory(new AutofacControllerFactory(ContainerProvider));
RegisterRoutes(RouteTable.Routes);
_host = OrchardStarter.CreateHost(MvcSingletons);
@@ -91,11 +101,21 @@ namespace Orchard.Web {
protected void MvcSingletons(ContainerBuilder builder) {
builder.Register(ControllerBuilder.Current);
builder.Register(RouteTable.Routes);
builder.Register(ModelBinders.Binders);
builder.Register(ModelMetadataProviders.Current);
builder.Register(ViewEngines.Engines);
builder.RegisterInstance(ControllerBuilder.Current);
builder.RegisterInstance(RouteTable.Routes);
builder.RegisterInstance(ModelBinders.Binders);
builder.RegisterInstance(ModelMetadataProviders.Current);
builder.RegisterInstance(ViewEngines.Engines);
}
#region Implementation of IContainerProviderAccessor
public IContainerProvider ContainerProvider {
get {
return _containerProvider;
}
}
#endregion
}
}

View File

@@ -31,6 +31,18 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Autofac, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.dll</HintPath>
</Reference>
<Reference Include="Autofac.Integration.Web, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.Integration.Web.dll</HintPath>
</Reference>
<Reference Include="Autofac.Integration.Web.Mvc, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.Integration.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="NHibernate.ByteCode.Castle, Version=2.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\fluentnhibernate\NHibernate.ByteCode.Castle.dll</HintPath>

View File

@@ -144,6 +144,7 @@
</httpHandlers>
<httpModules>
<add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpModules>
@@ -177,6 +178,7 @@
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/>
<remove name="ScriptModule" />
<remove name="UrlRoutingModule" />
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

View File

@@ -1,13 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autofac.Builder;
using Autofac;
namespace Orchard.ContentManagement {
public class ContentModule : Module {
protected override void Load(ContainerBuilder builder) {
builder.Register<DefaultContentQuery>().As<IContentQuery>().FactoryScoped();
builder.RegisterType<DefaultContentQuery>().As<IContentQuery>().InstancePerDependency();
}
}
}

View File

@@ -8,13 +8,13 @@ using Orchard.Mvc.ViewModels;
namespace Orchard.ContentManagement {
public class DefaultContentManager : IContentManager {
private readonly IContext _context;
private readonly IComponentContext _context;
private readonly IRepository<ContentTypeRecord> _contentTypeRepository;
private readonly IRepository<ContentItemRecord> _contentItemRepository;
private readonly IRepository<ContentItemVersionRecord> _contentItemVersionRepository;
public DefaultContentManager(
IContext context,
IComponentContext context,
IRepository<ContentTypeRecord> contentTypeRepository,
IRepository<ContentItemRecord> contentItemRepository,
IRepository<ContentItemVersionRecord> contentItemVersionRepository) {

View File

@@ -1,9 +1,9 @@
using Autofac.Builder;
using Autofac;
namespace Orchard.Data {
public class DataModule : Module {
protected override void Load(ContainerBuilder builder) {
builder.RegisterGeneric(typeof (Repository<>)).As(typeof (IRepository<>)).FactoryScoped();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency();
}
}
}

View File

@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Autofac;
using Autofac.Core;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Records;
using Orchard.Extensions;

View File

@@ -1,4 +1,3 @@
using System;
using System.Linq;
using System.Web.Mvc;
using Autofac;
@@ -40,7 +39,7 @@ namespace Orchard.Environment {
void IOrchardHost.Initialize() {
ViewEngines.Engines.Insert(0, LayoutViewEngine.CreateShim());
_controllerBuilder.SetControllerFactory(new OrchardControllerFactory());
ServiceLocator.SetLocator(t => _containerProvider.RequestContainer.Resolve(t));
ServiceLocator.SetLocator(t => _containerProvider.RequestLifetime.Resolve(t));
CreateAndActivateShell();
}
@@ -87,7 +86,7 @@ namespace Orchard.Environment {
}
protected virtual void EndRequest() {
_containerProvider.DisposeRequestContainer();
_containerProvider.EndRequestLifetime();
}
@@ -95,7 +94,7 @@ namespace Orchard.Environment {
return CreateShellContainer().Resolve<IOrchardShell>();
}
public virtual IContainer CreateShellContainer() {
public virtual ILifetimeScope CreateShellContainer() {
var settings = _shellSettingsLoader.LoadSettings();
if (settings.Any()) {
//TEMP: multi-tenancy not implemented yet
@@ -106,7 +105,7 @@ namespace Orchard.Environment {
return CreateShellContainer(null);
}
private IContainer CreateShellContainer(IShellSettings shellSettings) {
private ILifetimeScope CreateShellContainer(IShellSettings shellSettings) {
foreach (var factory in _shellContainerFactories) {
var container = factory.CreateContainer(shellSettings);
if (container != null) {
@@ -116,16 +115,16 @@ namespace Orchard.Environment {
return null;
}
private void HackSimulateExtensionActivation(IContainer shellContainer) {
private void HackSimulateExtensionActivation(ILifetimeScope shellContainer) {
var containerProvider = new FiniteContainerProvider(shellContainer);
try {
var requestContainer = containerProvider.RequestContainer;
var requestContainer = containerProvider.RequestLifetime;
var hackInstallationGenerator = requestContainer.Resolve<IHackInstallationGenerator>();
hackInstallationGenerator.GenerateActivateEvents();
}
finally {
containerProvider.DisposeRequestContainer();
containerProvider.EndRequestLifetime();
}
}
}

View File

@@ -1,27 +1,28 @@
using System.Collections.Generic;
using System.Linq;
using Autofac;
using Autofac.Core;
using AutofacContrib.DynamicProxy2;
namespace Orchard.Environment {
public class ExtensibleInterceptionModule : InterceptionModule {
public ExtensibleInterceptionModule(IEnumerable<IComponentInterceptorProvider> providers)
: base(new CombinedProvider(providers.Concat(new[] { new FlexibleInterceptorProvider() })), new FlexibleInterceptorAttacher()) {
}
//public class ExtensibleInterceptionModule : InterceptionModule {
// public ExtensibleInterceptionModule(IEnumerable<IComponentInterceptorProvider> providers)
// : base(new CombinedProvider(providers.Concat(new[] { new FlexibleInterceptorProvider() })), new FlexibleInterceptorAttacher()) {
// }
class CombinedProvider : IComponentInterceptorProvider {
private readonly IEnumerable<IComponentInterceptorProvider> _providers;
// class CombinedProvider : IComponentInterceptorProvider {
// private readonly IEnumerable<IComponentInterceptorProvider> _providers;
public CombinedProvider(IEnumerable<IComponentInterceptorProvider> providers) {
_providers = providers;
}
// public CombinedProvider(IEnumerable<IComponentInterceptorProvider> providers) {
// _providers = providers;
// }
public IEnumerable<Service> GetInterceptorServices(IComponentDescriptor descriptor) {
return _providers
.SelectMany(x => x.GetInterceptorServices(descriptor))
.Distinct()
.ToList();
}
}
}
// public IEnumerable<Service> GetInterceptorServices(IComponentDescriptor descriptor) {
// return _providers
// .SelectMany(x => x.GetInterceptorServices(descriptor))
// .Distinct()
// .ToList();
// }
// }
//}
}

View File

@@ -1,21 +1,23 @@
using Autofac;
using Autofac.Integration.Web;
using Orchard.Environment.ShellBuilders;
namespace Orchard.Environment {
class FiniteContainerProvider : IContainerProvider {
public FiniteContainerProvider(IContainer applicationContainer) {
// explicitly create a request container for the life of this object
ApplicationContainer = applicationContainer;
RequestContainer = applicationContainer.CreateInnerContainer();
public FiniteContainerProvider(ILifetimeScope applicationContainer) {
//ApplicationContainer = applicationContainer;
RequestLifetime = applicationContainer.BeginLifetimeScope();
var builder = new ContainerUpdater();
// also inject this instance in case anyone asks for the container provider
RequestContainer.Build(builder => builder.Register(this).As<IContainerProvider>());
builder.RegisterInstance(this).As<IContainerProvider>();
builder.Update(RequestLifetime);
}
public void DisposeRequestContainer() {
var disposeContainer = RequestContainer;
RequestContainer = null;
public void EndRequestLifetime() {
var disposeContainer = RequestLifetime;
RequestLifetime = null;
if (disposeContainer != null)
disposeContainer.Dispose();
@@ -23,6 +25,6 @@ namespace Orchard.Environment {
public IContainer ApplicationContainer { get; private set; }
public IContainer RequestContainer { get; private set; }
public ILifetimeScope RequestLifetime { get; private set; }
}
}

View File

@@ -1,52 +1,48 @@
using System;
using System.Diagnostics;
using Autofac;
using Autofac.Builder;
using Autofac.Core;
using Autofac.Integration.Web;
using Autofac.Modules;
using AutofacContrib.DynamicProxy2;
using Orchard.Environment.Configuration;
using Orchard.Environment.ShellBuilders;
using Orchard.Extensions;
using Orchard.Extensions.Loaders;
using Orchard.Mvc;
namespace Orchard.Environment {
public static class OrchardStarter {
public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {
var builder = new ContainerBuilder();
// Modifies the container to automatically return IEnumerable<T> of service type T
builder.RegisterModule(new ImplicitCollectionSupportModule());
// a single default host implementation is needed for bootstrapping a web app domain
builder.Register<DefaultOrchardHost>().As<IOrchardHost>().SingletonScoped();
builder.Register<DefaultCompositionStrategy>().As<ICompositionStrategy>().SingletonScoped();
builder.Register<DefaultShellContainerFactory>().As<IShellContainerFactory>().SingletonScoped();
builder.Register<AppDataFolder>().As<IAppDataFolder>().SingletonScoped();
builder.Register<ShellSettingsLoader>().As<IShellSettingsLoader>().SingletonScoped();
builder.Register<SafeModeShellContainerFactory>().As<IShellContainerFactory>().SingletonScoped();
builder.RegisterType<DefaultOrchardHost>().As<IOrchardHost>().SingleInstance();
builder.RegisterType<DefaultCompositionStrategy>().As<ICompositionStrategy>().SingleInstance();
builder.RegisterType<DefaultShellContainerFactory>().As<IShellContainerFactory>().SingleInstance();
builder.RegisterType<AppDataFolder>().As<IAppDataFolder>().SingleInstance();
builder.RegisterType<ShellSettingsLoader>().As<IShellSettingsLoader>().SingleInstance();
builder.RegisterType<SafeModeShellContainerFactory>().As<IShellContainerFactory>().SingleInstance();
// The container provider gives you access to the lowest container at the time,
// and dynamically creates a per-request container. The DisposeRequestContainer method
// still needs to be called on end request, but that's the host component's job to worry about.
builder.Register<ContainerProvider>().As<IContainerProvider>().ContainerScoped();
// and dynamically creates a per-request container. The EndRequestLifetime method
// still needs to be called on end request, but that's the host component's job to worry about
builder.RegisterType<ContainerProvider>().As<IContainerProvider>().InstancePerLifetimeScope();
builder.Register<ExtensionManager>().As<IExtensionManager>().SingletonScoped();
builder.Register<AreaExtensionLoader>().As<IExtensionLoader>().SingletonScoped();
builder.Register<CoreExtensionLoader>().As<IExtensionLoader>().SingletonScoped();
builder.Register<ReferencedExtensionLoader>().As<IExtensionLoader>().SingletonScoped();
builder.Register<PrecompiledExtensionLoader>().As<IExtensionLoader>().SingletonScoped();
builder.Register<DynamicExtensionLoader>().As<IExtensionLoader>().SingletonScoped();
builder.RegisterType<ExtensionManager>().As<IExtensionManager>().SingleInstance();
builder.RegisterType<AreaExtensionLoader>().As<IExtensionLoader>().SingleInstance();
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.Register<ModuleFolders>().As<IExtensionFolders>()
.WithArguments(new NamedParameter("paths", new[] { "~/Core", "~/Modules" }))
.SingletonScoped();
builder.Register<AreaFolders>().As<IExtensionFolders>()
.WithArguments(new NamedParameter("paths", new[] { "~/Areas" }))
.SingletonScoped();
builder.Register<ThemeFolders>().As<IExtensionFolders>()
.WithArguments(new NamedParameter("paths", new[] { "~/Core", "~/Themes" }))
.SingletonScoped();
builder.RegisterType<ModuleFolders>().As<IExtensionFolders>()
.WithParameter(new NamedParameter("paths", new[] { "~/Core", "~/Modules" }))
.SingleInstance();
builder.RegisterType<AreaFolders>().As<IExtensionFolders>()
.WithParameter(new NamedParameter("paths", new[] { "~/Areas" }))
.SingleInstance();
builder.RegisterType<ThemeFolders>().As<IExtensionFolders>()
.WithParameter(new NamedParameter("paths", new[] { "~/Core", "~/Themes" }))
.SingleInstance();
registrations(builder);
@@ -55,7 +51,11 @@ namespace Orchard.Environment {
public static IOrchardHost CreateHost(Action<ContainerBuilder> registrations) {
var container = CreateHostContainer(registrations);
var updater = new ContainerUpdater();
updater.RegisterInstance(container);
updater.Update(container);
var orchardHost = container.Resolve<IOrchardHost>();
return orchardHost;
}
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using Autofac;
using Autofac.Core;
namespace Orchard.Environment.ShellBuilders {
public class ContainerUpdater : ContainerBuilder {
ICollection<Action<IComponentRegistry>> _configurationActions = new List<Action<IComponentRegistry>>();
public override void RegisterCallback(Action<IComponentRegistry> configurationAction) {
_configurationActions.Add(configurationAction);
}
public void Update(IContainer container) {
foreach (var action in _configurationActions)
action(container.ComponentRegistry);
}
public void Update(ILifetimeScope container) {
foreach (var action in _configurationActions)
action(container.ComponentRegistry);
}
}
}

View File

@@ -1,8 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using Autofac;
using Autofac.Builder;
using AutofacContrib.DynamicProxy2;
using Autofac.Core;
using Orchard.Environment.Configuration;
namespace Orchard.Environment.ShellBuilders {
@@ -15,53 +13,55 @@ namespace Orchard.Environment.ShellBuilders {
_compositionStrategy = compositionStrategy;
}
public virtual IContainer CreateContainer(IShellSettings settings) {
public virtual ILifetimeScope CreateContainer(IShellSettings settings) {
// null settings means we need to defer to the setup container factory
if (settings == null) {
return null;
}
// add module types to container being built
var addingModulesAndServices = new ContainerBuilder();
addingModulesAndServices.Register(settings).As<IShellSettings>();
addingModulesAndServices.Register<DefaultOrchardShell>().As<IOrchardShell>().SingletonScoped();
var addingModulesAndServices = new ContainerUpdater();
addingModulesAndServices.RegisterInstance(settings).As<IShellSettings>();
addingModulesAndServices.RegisterType<DefaultOrchardShell>().As<IOrchardShell>().SingleInstance();
foreach (var moduleType in _compositionStrategy.GetModuleTypes()) {
addingModulesAndServices.Register(moduleType).As<IModule>().ContainerScoped();
addingModulesAndServices.RegisterType(moduleType).As<IModule>().InstancePerLifetimeScope();
}
// add components by the IDependency interfaces they expose
foreach (var serviceType in _compositionStrategy.GetDependencyTypes()) {
foreach (var interfaceType in serviceType.GetInterfaces()) {
if (typeof(IDependency).IsAssignableFrom(interfaceType)) {
var registrar = addingModulesAndServices.Register(serviceType).As(interfaceType);
var registrar = addingModulesAndServices.RegisterType(serviceType).As(interfaceType);
if (typeof(ISingletonDependency).IsAssignableFrom(interfaceType)) {
registrar.SingletonScoped();
registrar.SingleInstance();
}
else if (typeof(ITransientDependency).IsAssignableFrom(interfaceType)) {
registrar.FactoryScoped();
registrar.InstancePerDependency();
}
else {
registrar.ContainerScoped();
registrar.InstancePerLifetimeScope();
}
}
}
}
var shellContainer = _container.CreateInnerContainer();
shellContainer.TagWith("shell");
addingModulesAndServices.Build(shellContainer);
var shellScope = _container.BeginLifetimeScope("shell");
addingModulesAndServices.Update(shellScope);
// instantiate and register modules on container being built
var modules = shellContainer.Resolve<IEnumerable<IModule>>();
var addingModules = new ContainerBuilder();
var modules = shellScope.Resolve<IEnumerable<IModule>>();
var addingModules = new ContainerUpdater();
foreach (var module in modules) {
addingModules.RegisterModule(module);
}
addingModules.RegisterModule(new ExtensibleInterceptionModule(modules.OfType<IComponentInterceptorProvider>()));
addingModules.Build(shellContainer);
return shellContainer;
// DynamicProxy2.
// addingModules.RegisterModule(new ExtensibleInterceptionModule(modules.OfType<IComponentInterceptorProvider>()));
addingModules.Update(shellScope);
return shellScope;
}
}
}

View File

@@ -3,6 +3,6 @@ using Orchard.Environment.Configuration;
namespace Orchard.Environment.ShellBuilders {
public interface IShellContainerFactory {
IContainer CreateContainer(IShellSettings settings);
ILifetimeScope CreateContainer(IShellSettings settings);
}
}

View File

@@ -5,6 +5,8 @@ using System.Reflection;
using System.Web;
using System.Web.Routing;
using Autofac;
using Autofac.Builder;
using Autofac.Core;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Handlers;
using Orchard.Data.Builders;
@@ -31,66 +33,61 @@ namespace Orchard.Environment.ShellBuilders {
_container = container;
}
public IContainer CreateContainer(IShellSettings settings) {
public ILifetimeScope CreateContainer(IShellSettings settings) {
// when you have settings the setup container factory is not in effect
if (settings != null) {
return null;
}
var shellContainer = _container.CreateInnerContainer();
shellContainer.Build(builder => {
// standard services needed in safe mode
builder.Register<DefaultOrchardShell>().As<IOrchardShell>().ContainerScoped();
builder.Register<RoutePublisher>().As<IRoutePublisher>().ContainerScoped();
builder.Register<ModelBinderPublisher>().As<IModelBinderPublisher>().ContainerScoped();
builder.Register<MvcModule>().As<IModule>().ContainerScoped();
builder.Register<WebFormsViewEngineProvider>().As<IViewEngineProvider>().ContainerScoped();
builder.Register<ViewEngineFilter>().As<IFilterProvider>().ContainerScoped();
builder.Register<ThemeFilter>().As<IFilterProvider>().ContainerScoped();
builder.Register<PageTitleBuilder>().As<IPageTitleBuilder>().ContainerScoped();
builder.Register<ZoneManager>().As<IZoneManager>().ContainerScoped();
builder.Register<PageClassBuilder>().As<IPageClassBuilder>().ContainerScoped();
builder.Register<Notifier>().As<INotifier>().ContainerScoped();
builder.Register<NotifyFilter>().As<IFilterProvider>().ContainerScoped();
builder.Register<SessionFactoryBuilder>().As<ISessionFactoryBuilder>().ContainerScoped();
// safe mode specific implementations of needed service interfaces
builder.Register<NullHackInstallationGenerator>().As<IHackInstallationGenerator>().ContainerScoped();
builder.Register<SafeModeThemeService>().As<IThemeService>().ContainerScoped();
builder.Register<SafeModeText>().As<IText>().ContainerScoped();
builder.Register<SafeModeSiteService>().As<ISiteService>().ContainerScoped();
// yes, this is brutal, and if you are reading this, I sincerely apologize.
var dependencies = Assembly.Load("Orchard.Setup")
.GetExportedTypes()
.Where(type => type.IsClass && !type.IsAbstract && typeof(IDependency).IsAssignableFrom(type));
foreach (var serviceType in dependencies) {
foreach (var interfaceType in serviceType.GetInterfaces()) {
if (typeof(IDependency).IsAssignableFrom(interfaceType)) {
var registrar = builder.Register(serviceType).As(interfaceType);
if (typeof(ISingletonDependency).IsAssignableFrom(interfaceType)) {
registrar.SingletonScoped();
}
else if (typeof(ITransientDependency).IsAssignableFrom(interfaceType)) {
registrar.FactoryScoped();
}
else {
registrar.ContainerScoped();
}
var shellScope = _container.BeginLifetimeScope();
var builder = new ContainerUpdater();
// standard services needed in safe mode
builder.RegisterType<DefaultOrchardShell>().As<IOrchardShell>().InstancePerLifetimeScope();
builder.RegisterType<RoutePublisher>().As<IRoutePublisher>().InstancePerLifetimeScope();
builder.RegisterType<ModelBinderPublisher>().As<IModelBinderPublisher>().InstancePerLifetimeScope();
builder.RegisterType<MvcModule>().As<IModule>().InstancePerLifetimeScope();
builder.RegisterType<WebFormsViewEngineProvider>().As<IViewEngineProvider>().InstancePerLifetimeScope();
builder.RegisterType<ViewEngineFilter>().As<IFilterProvider>().InstancePerLifetimeScope();
builder.RegisterType<ThemeFilter>().As<IFilterProvider>().InstancePerLifetimeScope();
builder.RegisterType<PageTitleBuilder>().As<IPageTitleBuilder>().InstancePerLifetimeScope();
builder.RegisterType<ZoneManager>().As<IZoneManager>().InstancePerLifetimeScope();
builder.RegisterType<PageClassBuilder>().As<IPageClassBuilder>().InstancePerLifetimeScope();
builder.RegisterType<Notifier>().As<INotifier>().InstancePerLifetimeScope();
builder.RegisterType<NotifyFilter>().As<IFilterProvider>().InstancePerLifetimeScope();
builder.RegisterType<SessionFactoryBuilder>().As<ISessionFactoryBuilder>().InstancePerLifetimeScope();
// safe mode specific implementations of needed service interfaces
builder.RegisterType<NullHackInstallationGenerator>().As<IHackInstallationGenerator>().InstancePerLifetimeScope();
builder.RegisterType<SafeModeThemeService>().As<IThemeService>().InstancePerLifetimeScope();
builder.RegisterType<SafeModeText>().As<IText>().InstancePerLifetimeScope();
builder.RegisterType<SafeModeSiteService>().As<ISiteService>().InstancePerLifetimeScope();
// yes, this is brutal, and if you are reading this, I sincerely apologize.
var dependencies = Assembly.Load("Orchard.Setup")
.GetExportedTypes()
.Where(type => type.IsClass && !type.IsAbstract && typeof(IDependency).IsAssignableFrom(type));
foreach (var serviceType in dependencies) {
foreach (var interfaceType in serviceType.GetInterfaces()) {
if (typeof(IDependency).IsAssignableFrom(interfaceType)) {
var registrar = builder.RegisterType(serviceType).As(interfaceType);
if (typeof(ISingletonDependency).IsAssignableFrom(interfaceType)) {
registrar.SingleInstance();
}
else if (typeof(ITransientDependency).IsAssignableFrom(interfaceType)) {
registrar.InstancePerDependency();
}
else {
registrar.InstancePerLifetimeScope();
}
}
}
});
}
builder.Update(shellScope);
var modulesUpdater = new ContainerUpdater();
foreach (var module in _container.Resolve<IEnumerable<IModule>>()) {
modulesUpdater.RegisterModule(module);
}
//modulesUpdater.Update(shellScope);
shellContainer.Build(builder => {
foreach (var module in shellContainer.Resolve<IEnumerable<IModule>>()) {
builder.RegisterModule(module);
}
});
return shellContainer;
return shellScope;
}
class SafeModeText : IText {

View File

@@ -10,16 +10,16 @@ namespace Orchard.Environment {
public class StandaloneEnvironment : IStandaloneEnvironment {
private readonly IContainerProvider _containerProvider;
public StandaloneEnvironment(IContainer applicationContainer) {
public StandaloneEnvironment(ILifetimeScope applicationContainer) {
_containerProvider = new FiniteContainerProvider(applicationContainer);
}
public TService Resolve<TService>() {
return _containerProvider.RequestContainer.Resolve<TService>();
return _containerProvider.RequestLifetime.Resolve<TService>();
}
public void Dispose() {
_containerProvider.DisposeRequestContainer();
_containerProvider.EndRequestLifetime();
}
}
}

View File

@@ -1,23 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using Module = Autofac.Builder.Module;
using Autofac;
using Autofac.Core;
using Module = Autofac.Module;
namespace Orchard.Localization {
public class LocalizationModule : Module {
protected override void Load(Autofac.Builder.ContainerBuilder builder) {
builder.Register<Text>().As<IText>().FactoryScoped();
protected override void Load(ContainerBuilder builder) {
builder.RegisterType<Text>().As<IText>().InstancePerDependency();
}
protected override void AttachToComponentRegistration(Autofac.IContainer container, Autofac.IComponentRegistration registration) {
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration) {
var userProperty = FindUserProperty(registration.Descriptor.BestKnownImplementationType);
var userProperty = FindUserProperty(registration.Activator.LimitType);
if (userProperty != null) {
var scope = registration.Descriptor.BestKnownImplementationType.FullName;
var scope = registration.Activator.LimitType.FullName;
registration.Activated += (sender, e) => {
//var authenticationService = e.Context.Resolve<IAuthenticationService>();

View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc;
using Autofac;
using Orchard.Mvc;
@@ -13,7 +9,7 @@ namespace Orchard.Localization {
return context == null ? NullLocalizer.Instance : Resolve(context, scope);
}
public static Localizer Resolve(IContext context, string scope) {
public static Localizer Resolve(IComponentContext context, string scope) {
var text = context.Resolve<IText>(new NamedParameter("scope", scope));
return text.Get;
}

View File

@@ -3,26 +3,26 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Autofac;
using Autofac.Builder;
using Autofac.Core;
using Castle.Core.Logging;
using Module = Autofac.Builder.Module;
using Module = Autofac.Module;
namespace Orchard.Logging {
public class LoggingModule : Module {
protected override void Load(ContainerBuilder moduleBuilder) {
// by default, use Orchard's logger that delegates to Castle's logger factory
moduleBuilder.Register<CastleLoggerFactory>().As<ILoggerFactory>().ContainerScoped();
moduleBuilder.RegisterType<CastleLoggerFactory>().As<ILoggerFactory>().InstancePerLifetimeScope();
// by default, use Castle's TraceSource based logger factory
moduleBuilder.Register<TraceLoggerFactory>().As<Castle.Core.Logging.ILoggerFactory>().ContainerScoped();
moduleBuilder.RegisterType<TraceLoggerFactory>().As<Castle.Core.Logging.ILoggerFactory>().InstancePerLifetimeScope();
// call CreateLogger in response to the request for an ILogger implementation
moduleBuilder.Register((ctx, ps) => CreateLogger(ctx, ps)).As<ILogger>().FactoryScoped();
moduleBuilder.Register((ctx, ps) => CreateLogger(ctx, ps)).As<ILogger>().InstancePerDependency();
}
protected override void AttachToComponentRegistration(IContainer container, IComponentRegistration registration) {
var implementationType = registration.Descriptor.BestKnownImplementationType;
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration) {
var implementationType = registration.Activator.LimitType;
// build an array of actions on this type to assign loggers to member properties
var injectors = BuildLoggerInjectors(implementationType).ToArray();
@@ -38,7 +38,7 @@ namespace Orchard.Logging {
};
}
private IEnumerable<Action<IContext, object>> BuildLoggerInjectors(Type componentType) {
private IEnumerable<Action<IComponentContext, object>> BuildLoggerInjectors(Type componentType) {
// Look for settable properties of type "ILogger"
var loggerProperties = componentType
.GetProperties(BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance)
@@ -63,7 +63,7 @@ namespace Orchard.Logging {
}
}
private static ILogger CreateLogger(IContext context, IEnumerable<Parameter> parameters) {
private static ILogger CreateLogger(IComponentContext context, IEnumerable<Parameter> parameters) {
// return an ILogger in response to Resolve<ILogger>(componentTypeParameter)
var loggerFactory = context.Resolve<ILoggerFactory>();
var containingType = parameters.TypedAs<Type>();

View File

@@ -1,5 +1,6 @@
using System;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Web;
namespace Orchard.Mvc.Html {
@@ -14,7 +15,7 @@ namespace Orchard.Mvc.Html {
if (containerProvider == null)
throw new ApplicationException("Unable to resolve");
return containerProvider.RequestContainer.Resolve<TService>();
return (containerProvider.RequestLifetime).Resolve<TService>();
}
}
}

View File

@@ -4,10 +4,11 @@ using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Autofac;
using Autofac.Builder;
using Autofac.Integration.Web;
using Autofac.Integration.Web.Mvc;
using Orchard.Mvc.Filters;
using Orchard.Extensions;
using Autofac.Core;
namespace Orchard.Mvc {
public class MvcModule : Module {
@@ -20,16 +21,18 @@ namespace Orchard.Mvc {
protected override void Load(ContainerBuilder moduleBuilder) {
var extensions = _extensionManager.ActiveExtensions();
var assemblies = extensions.Select(x => x.Assembly);
var actionInvokerService = new UniqueService();
moduleBuilder.RegisterType<FilterResolvingActionInvoker>().As(actionInvokerService).InstancePerDependency();
var module = new AutofacControllerModule(assemblies.ToArray()) {
ActionInvokerType = typeof(FilterResolvingActionInvoker),
IdentificationStrategy = new OrchardControllerIdentificationStrategy(extensions)
};
moduleBuilder.RegisterControllers(new OrchardControllerIdentificationStrategy(extensions), assemblies.ToArray())
.InjectActionInvoker(actionInvokerService);
moduleBuilder.RegisterModule(module);
moduleBuilder.Register(ctx => HttpContextBaseFactory(ctx)).As<HttpContextBase>().FactoryScoped();
moduleBuilder.Register(ctx => RequestContextFactory(ctx)).As<RequestContext>().FactoryScoped();
moduleBuilder.Register(ctx => UrlHelperFactory(ctx)).As<UrlHelper>().FactoryScoped();
moduleBuilder.Register(ctx => HttpContextBaseFactory(ctx)).As<HttpContextBase>().InstancePerDependency();
moduleBuilder.Register(ctx => RequestContextFactory(ctx)).As<RequestContext>().InstancePerDependency();
moduleBuilder.Register(ctx => UrlHelperFactory(ctx)).As<UrlHelper>().InstancePerDependency();
ControllerBuilder.Current.SetControllerFactory(
new AutofacControllerFactory(new ContainerProvider(moduleBuilder.Build())));
}
private static bool IsRequestValid() {
@@ -47,7 +50,7 @@ namespace Orchard.Mvc {
return true;
}
static HttpContextBase HttpContextBaseFactory(IContext context) {
static HttpContextBase HttpContextBaseFactory(IComponentContext context) {
if (IsRequestValid()) {
return new HttpContextWrapper(HttpContext.Current);
}
@@ -55,7 +58,7 @@ namespace Orchard.Mvc {
return new HttpContextPlaceholder();
}
static RequestContext RequestContextFactory(IContext context) {
static RequestContext RequestContextFactory(IComponentContext context) {
var httpContext = context.Resolve<HttpContextBase>();
var mvcHandler = httpContext.Handler as MvcHandler;
if (mvcHandler != null) {
@@ -65,7 +68,7 @@ namespace Orchard.Mvc {
return new RequestContext(httpContext, new RouteData());
}
static UrlHelper UrlHelperFactory(IContext context) {
static UrlHelper UrlHelperFactory(IComponentContext context) {
return new UrlHelper(context.Resolve<RequestContext>(), context.Resolve<RouteCollection>());
}

View File

@@ -1,6 +1,8 @@
using System.Collections.Generic;
using System.Web.Mvc;
using System.Web.Routing;
using Autofac;
using Autofac.Core;
using Autofac.Integration.Web;
namespace Orchard.Mvc {
@@ -19,9 +21,10 @@ namespace Orchard.Mvc {
// Now that the request container is known - try to resolve the controller
object controller;
List<Parameter> paramlist = new List<Parameter> { TypedParameter.From(requestContext) };
if (container != null &&
container.TryResolve(serviceName, out controller, TypedParameter.From(requestContext))) {
return (IController) controller;
container.TryResolve(new NamedService(serviceName, typeof(IController)), new List<Parameter>{TypedParameter.From(requestContext)}, out controller)) {
return (IController)controller;
}
return base.CreateController(requestContext, controllerName);
}
@@ -49,14 +52,14 @@ namespace Orchard.Mvc {
return GetAreaName(routeData.Route);
}
public static IContainer GetRequestContainer(RouteData routeData) {
public static ILifetimeScope GetRequestContainer(RouteData routeData) {
object dataTokenValue;
if (routeData != null &&
routeData.DataTokens != null &&
routeData.DataTokens.TryGetValue("IContainerProvider", out dataTokenValue) &&
dataTokenValue is IContainerProvider) {
var containerProvider = (IContainerProvider) dataTokenValue;
return containerProvider.RequestContainer;
return containerProvider.RequestLifetime;
}
return null;
}

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Autofac;
using Autofac.Core;
using Autofac.Integration.Web.Mvc;
using Orchard.Extensions;
@@ -41,7 +41,7 @@ namespace Orchard.Mvc {
areaName = assemblySimpleName;
}
var controllerName = controllerType.Name.Replace("Controller", "");
return new NamedService(("controller." + areaName + "." + controllerName).ToLowerInvariant());
return new NamedService(("controller." + areaName + "." + controllerName).ToLowerInvariant(), controllerType);
}
}
}

View File

@@ -31,6 +31,22 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Autofac, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.dll</HintPath>
</Reference>
<Reference Include="Autofac.Integration.Web, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.Integration.Web.dll</HintPath>
</Reference>
<Reference Include="Autofac.Integration.Web.Mvc, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac\Autofac.Integration.Web.Mvc.dll</HintPath>
</Reference>
<Reference Include="AutofacContrib.DynamicProxy2, Version=2.1.13.813, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\autofac-contrib\AutofacContrib.DynamicProxy2.dll</HintPath>
</Reference>
<Reference Include="Castle.Core, Version=1.1.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\Castle Windsor 2.0\bin\Castle.Core.dll</HintPath>
@@ -131,6 +147,7 @@
<Compile Include="Environment\Configuration\AppDataFolder.cs" />
<Compile Include="Environment\Configuration\ShellSettingsLoader.cs" />
<Compile Include="Environment\ExtensibleInterceptionModule.cs" />
<Compile Include="Environment\ShellBuilders\ContainerUpdater.cs" />
<Compile Include="Environment\ShellBuilders\DefaultShellContainerFactory.cs" />
<Compile Include="Environment\ShellBuilders\IShellContainerFactory.cs" />
<Compile Include="Environment\ShellBuilders\SafeModeShellContainerFactory.cs" />
@@ -361,6 +378,7 @@
<Compile Include="IMapper.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="ContentManagement\Diagram.cd" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -3,31 +3,41 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Autofac;
using Autofac.Core;
using AutofacContrib.DynamicProxy2;
using Castle.Core.Interceptor;
using Module = Autofac.Builder.Module;
using Module = Autofac.Module;
namespace Orchard.Security {
public class SecurityModule : Module, IComponentInterceptorProvider {
public IEnumerable<Service> GetInterceptorServices(IComponentDescriptor descriptor) {
var property = FindProperty(descriptor.BestKnownImplementationType);
if (property != null) {
if (property.GetGetMethod(true).IsVirtual == false) {
throw new ApplicationException(string.Format("CurrentUser property must be virtual on class {0}", descriptor.BestKnownImplementationType.FullName));
}
yield return new TypedService(typeof(ISecurityModuleInterceptor));
}
}
//public class SecurityModule : Module {
// protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration) {
// var implementationType = registration.Activator.LimitType;
// var property = FindProperty(implementationType);
private static PropertyInfo FindProperty(Type type) {
return type.GetProperty("CurrentUser",
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
null,
typeof(IUser),
new Type[0],
null);
}
}
// if (property != null) {
// }
// }
// public IEnumerable<Service> GetInterceptorServices(IComponentDescriptor descriptor) {
// var property = FindProperty(descriptor.BestKnownImplementationType);
// if (property != null) {
// if (property.GetGetMethod(true).IsVirtual == false) {
// throw new ApplicationException(string.Format("CurrentUser property must be virtual on class {0}", descriptor.BestKnownImplementationType.FullName));
// }
// yield return new TypedService(typeof(ISecurityModuleInterceptor));
// }
// }
// private static PropertyInfo FindProperty(Type type) {
// return type.GetProperty("CurrentUser",
// BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
// null,
// typeof(IUser),
// new Type[0],
// null);
// }
//}
public interface ISecurityModuleInterceptor : IInterceptor, IDependency {

View File

@@ -2,32 +2,33 @@
using System.Collections.Generic;
using System.Reflection;
using Autofac;
using Autofac.Core;
using AutofacContrib.DynamicProxy2;
using Castle.Core.Interceptor;
using Orchard.Security;
using Module = Autofac.Builder.Module;
using Module = Autofac.Module;
namespace Orchard.Settings {
public class SettingsModule : Module, IComponentInterceptorProvider {
public IEnumerable<Service> GetInterceptorServices(IComponentDescriptor descriptor) {
var property = FindProperty(descriptor.BestKnownImplementationType);
if (property != null) {
if (property.GetGetMethod(true).IsVirtual == false) {
throw new ApplicationException(string.Format("CurrentSite property must be virtual on class {0}", descriptor.BestKnownImplementationType.FullName));
}
yield return new TypedService(typeof(ISettingsModuleInterceptor));
}
}
//public class SettingsModule : Module, IComponentInterceptorProvider {
// public IEnumerable<Service> GetInterceptorServices(IComponentDescriptor descriptor) {
// var property = FindProperty(descriptor.BestKnownImplementationType);
// if (property != null) {
// if (property.GetGetMethod(true).IsVirtual == false) {
// throw new ApplicationException(string.Format("CurrentSite property must be virtual on class {0}", descriptor.BestKnownImplementationType.FullName));
// }
// yield return new TypedService(typeof(ISettingsModuleInterceptor));
// }
// }
private static PropertyInfo FindProperty(Type type) {
return type.GetProperty("CurrentSite",
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
null,
typeof(ISite),
new Type[0],
null);
}
}
// private static PropertyInfo FindProperty(Type type) {
// return type.GetProperty("CurrentSite",
// BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
// null,
// typeof(ISite),
// new Type[0],
// null);
// }
//}
public interface ISettingsModuleInterceptor : IInterceptor, IDependency {

View File

@@ -1,13 +1,15 @@
using System;
using System.Reflection;
using Module = Autofac.Builder.Module;
using Autofac;
using Autofac.Core;
using Module = Autofac.Module;
namespace Orchard.Themes {
public class ThemesModule : Module {
protected override void AttachToComponentRegistration(Autofac.IContainer container, Autofac.IComponentRegistration registration) {
var themeProperty = FindThemeProperty(registration.Descriptor.BestKnownImplementationType);
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration) {
var themeProperty = FindThemeProperty(registration.Activator.LimitType);
if (themeProperty != null) {
registration.Activated += (sender, e) => {
var themeService = e.Context.Resolve<IThemeService>();

11
src/Orchard/app.config Normal file
View File

@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Castle.Core" publicKeyToken="407DD0808D44FBDC" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-1.2.0.0" newVersion="1.2.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>