MVC3 integrated, with some changes to make it compile on Mono and with Razor2
[mono.git] / mcs / class / System.Web.Mvc3 / Mvc / BuildManagerViewEngine.cs
1 namespace System.Web.Mvc {
2     using System;
3
4     public abstract class BuildManagerViewEngine : VirtualPathProviderViewEngine {
5         private IBuildManager _buildManager;
6         private IViewPageActivator _viewPageActivator;
7         private IResolver<IViewPageActivator> _activatorResolver;
8
9         protected BuildManagerViewEngine()
10             : this(null, null, null) {
11         }
12
13         protected BuildManagerViewEngine(IViewPageActivator viewPageActivator)
14             : this(viewPageActivator, null, null) {
15         }
16
17         internal BuildManagerViewEngine(IViewPageActivator viewPageActivator, IResolver<IViewPageActivator> activatorResolver, IDependencyResolver dependencyResolver) {
18             if (viewPageActivator != null) {
19                 _viewPageActivator = viewPageActivator;
20             }
21             else {
22                 _activatorResolver = activatorResolver ?? new SingleServiceResolver<IViewPageActivator>(
23                     () => null,
24                     new DefaultViewPageActivator(dependencyResolver),
25                     "BuildManagerViewEngine constructor"
26                 );
27             }
28         }
29
30         internal IBuildManager BuildManager {
31             get {
32                 if (_buildManager == null)
33                     _buildManager = new BuildManagerWrapper();
34                 return _buildManager;
35             }
36             set {
37                 _buildManager = value;
38             }
39         }
40
41         protected override bool FileExists(ControllerContext controllerContext, string virtualPath) {
42             return BuildManager.FileExists(virtualPath);
43         }
44
45         protected IViewPageActivator ViewPageActivator {
46             get {
47                 if (_viewPageActivator != null) {
48                     return _viewPageActivator;
49                 }
50                 _viewPageActivator = _activatorResolver.Current;
51                 return _viewPageActivator;
52             }
53         }
54
55         internal class DefaultViewPageActivator : IViewPageActivator {
56             Func<IDependencyResolver> _resolverThunk;
57
58             public DefaultViewPageActivator()
59                 : this(null) {
60             }
61
62             public DefaultViewPageActivator(IDependencyResolver resolver) {
63                 if (resolver == null) {
64                     _resolverThunk = () => DependencyResolver.Current;
65                 }
66                 else {
67                     _resolverThunk = () => resolver;
68                 }
69             }
70
71             public object Create(ControllerContext controllerContext, Type type) {
72                 return _resolverThunk().GetService(type) ?? Activator.CreateInstance(type);
73             }
74         }
75     }
76 }