using Autofac; using Autofac.Core.Lifetime; using Autofac.Integration.Mvc; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; namespace GreenTree.Nachtragsmanagement.Core.Plugins { public static class PluginExtensions { public static string GetLogoUrl(this PluginDescriptor pluginDescriptor, IWebHelper webHelper) { if (pluginDescriptor == null) throw new ArgumentNullException("pluginDescriptor"); if (webHelper == null) throw new ArgumentNullException("webHelper"); if (pluginDescriptor.OriginalAssemblyFile == null || pluginDescriptor.OriginalAssemblyFile.Directory == null) { return null; } var pluginDirectory = pluginDescriptor.OriginalAssemblyFile.Directory; var logoLocalPath = Path.Combine(pluginDirectory.FullName, "logo.jpg"); if (!File.Exists(logoLocalPath)) { return null; } string logoUrl = string.Format("~/plugins/{0}/logo.jpg", pluginDirectory.Name); return logoUrl; } #region Container public static T Resolve(this IContainer container, string key = "", ILifetimeScope scope = null) where T : class { if (scope == null) { //no scope specified scope = Scope(container); } if (string.IsNullOrEmpty(key)) { return scope.Resolve(); } return scope.ResolveKeyed(key); } public static object Resolve(this Type type, IContainer container, ILifetimeScope scope = null) { if (scope == null) { //no scope specified scope = Scope(container); } return scope.Resolve(type); } public static T[] ResolveAll(this IContainer container, string key = "", ILifetimeScope scope = null) { if (scope == null) { //no scope specified scope = Scope(container); } if (string.IsNullOrEmpty(key)) { return scope.Resolve>().ToArray(); } return scope.ResolveKeyed>(key).ToArray(); } public static T ResolveUnregistered(this IContainer container, ILifetimeScope scope = null) where T : class { return ResolveUnregistered(container, typeof(T), scope) as T; } public static object ResolveUnregistered(this IContainer container, Type type, ILifetimeScope scope = null) { if (scope == null) { //no scope specified scope = Scope(container); } var constructors = type.GetConstructors(); foreach (var constructor in constructors) { try { var parameters = constructor.GetParameters(); var parameterInstances = new List(); foreach (var parameter in parameters) { var service = Resolve(parameter.ParameterType, container, scope); if (service == null) throw new Exception("Unkown dependency"); parameterInstances.Add(service); } return Activator.CreateInstance(type, parameterInstances.ToArray()); } catch (Exception) { } } throw new Exception("No contructor was found that had all the dependencies satisfied."); } public static bool TryResolve(this IContainer container, Type serviceType, ILifetimeScope scope, out object instance) { if (scope == null) { //no scope specified scope = Scope(container); } return scope.TryResolve(serviceType, out instance); } public static bool IsRegistered(this IContainer container, Type serviceType, ILifetimeScope scope = null) { if (scope == null) { //no scope specified scope = Scope(container); } return scope.IsRegistered(serviceType); } public static object ResolveOptional(this IContainer container, Type serviceType, ILifetimeScope scope = null) { if (scope == null) { //no scope specified scope = Scope(container); } return scope.ResolveOptional(serviceType); } public static ILifetimeScope Scope(this IContainer container) { try { if (HttpContext.Current != null) return AutofacDependencyResolver.Current.RequestLifetimeScope; //when such lifetime scope is returned, you should be sure that it'll be disposed once used (e.g. in schedule tasks) return container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag); } catch (Exception) { //we can get an exception here if RequestLifetimeScope is already disposed //for example, requested in or after "Application_EndRequest" handler //but note that usually it should never happen //when such lifetime scope is returned, you should be sure that it'll be disposed once used (e.g. in schedule tasks) return container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag); } } #endregion } }