using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Configuration; using System.Web.Mvc; using Autofac; using Autofac.Integration.Mvc; using GreenTree.Nachtragsmanagement.Core.Configuration; using GreenTree.Nachtragsmanagement.Core.Data; using GreenTree.Nachtragsmanagement.Data; using GreenTree.Nachtragsmanagement.Services.Configuration; using GreenTree.Nachtragsmanagement.Services.DbContext; using GreenTree.Nachtragsmanagement.Services.Site; using GreenTree.Nachtragsmanagement.Services.Test; using GreenTree.Nachtragsmanagement.Services.User; using GreenTree.Nachtragsmanagement.Services.Deviation; using GreenTree.Nachtragsmanagement.Services.Misc; using GreenTree.Nachtragsmanagement.Core; using GreenTree.Nachtragsmanagement.Core.Plugins; using GreenTree.Nachtragsmanagement.Web.Framework.Mvc.Routes; using System.Web.Routing; using GreenTree.Nachtragsmanagement.Core.Authentication; namespace GreenTree.Nachtragsmanagement.Web.Framework { public class ApplicationContext { #region Statics /// /// Current ApplicationContext /// private static ApplicationContext _current; /// /// Returns the current ApplicationContext or creates one if doesn't exist already /// public static ApplicationContext Current { get { if (_current == null) { _current = new ApplicationContext(); } return _current; } private set { _current = value; } } #endregion #region Fields /// /// Returns the application wide app container builder /// private static IContainer _appContainer; #endregion #region Ctor /// /// Initializes a new instance of the ApplicationContext class /// public ApplicationContext() { var appContext = Singleton.Instance; if (appContext == null) Singleton.Instance = this; } #endregion #region Initialization /// /// Registers all application ressources /// public static void InitApplication() { var builder = new ContainerBuilder(); var connection = WebConfigurationManager.ConnectionStrings["DefaultConnection"]; // Register object instances builder.RegisterInstance(new AppendixObjectContext(connection.ConnectionString)).As().SingleInstance(); // Register generic data repositorys builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)); // Register service types builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); // Register controllers builder.RegisterControllers(Assembly.GetCallingAssembly()); // Register modules builder.RegisterModule(new AutofacWebTypesModule()); Current = new ApplicationContext(); _appContainer = builder.Build(); Singleton.Instance = _appContainer; // Register plugin controllers in a new container builder var pluginsControllerBuilder = new ContainerBuilder(); var pluginsFinder = _appContainer.Resolve(); var pluginsInstalled = pluginsFinder.GetPlugins(LoadPluginsMode.InstalledOnly); foreach (var plugin in pluginsInstalled) { pluginsControllerBuilder.RegisterControllers(plugin.PluginDescriptor.ReferencedAssembly); } pluginsControllerBuilder.Update(_appContainer); DependencyResolver.SetResolver(new AutofacDependencyResolver(_appContainer)); } /// /// Registers all routes provided by every installed Plugin /// /// Registered routes where plugin routes should be append to. public static void InitPluginRoutes(RouteCollection routes) { var routePublisher = _appContainer.Resolve(); routePublisher.RegisterRoutes(routes); } #endregion } }