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
}
}