zoukankan      html  css  js  c++  java
  • Autofac

    程序集准备

    Assembly:

    Autofac/Autofac.Integration.Mvc/System.Web.Mvc/System.Web.Helpers/System.Web.WebPages.Deployment/System.Web.WebPages/

    System.Web.WebPages.Razor

    版本:

    Autofac:3.5.00  

    Autofac.Integration.Mvc:3.3.0.0

    System.Web.Mvc:5.2.3.0

    System.Web.Helpers:3.0.0.0

    System.Web.WebPages.Deployment:3.0.0.0

    System.Web.WebPages:3.0.0.0

    System.Web.WebPages.Razor:3.0.0.0

    开始

    webconfig,packages.config   因为重新引入版本的缘故改下

     1   <runtime>
     2     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     3       <dependentAssembly>
     4         <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
     5         <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
     6       </dependentAssembly>
     7       <dependentAssembly>
     8         <assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
     9         <bindingRedirect oldVersion="0.0.0.0-3.5.0.0" newVersion="3.5.0.0" />
    10       </dependentAssembly>
    11       <dependentAssembly>
    12         <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
    13         <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
    14       </dependentAssembly>
    15       <dependentAssembly>
    16         <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
    17         <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/>
    18       </dependentAssembly>
    19     </assemblyBinding>
    20   </runtime>
    View Code
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <packages>
     3   <package id="bootstrap" version="3.0.0" targetFramework="net45" />
     4   <package id="jQuery" version="1.10.2" targetFramework="net45" />
     5   <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
     6   <package id="Microsoft.AspNet.Mvc.zh-Hans" version="5.2.3" targetFramework="net45" />
     7   <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
     8   <package id="Microsoft.AspNet.Razor.zh-Hans" version="3.2.3" targetFramework="net45" />
     9   <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
    10   <package id="Microsoft.AspNet.WebPages.zh-Hans" version="3.2.3" targetFramework="net45" />
    11   <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net45" />
    12   <package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net45" developmentDependency="true" />
    13   <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
    14   <package id="Modernizr" version="2.6.2" targetFramework="net45" />
    15 </packages>
    View Code

    Core部分

    贴代码

    1.ContainerManager

        /// <summary>
        /// Container manager
        /// </summary>
        public class ContainerManager
        {
            private readonly IContainer _container;
    
            /// <summary>
            /// Constructor
            /// </summary>
            /// <param name="container">Conainer</param>
            public ContainerManager(IContainer container)
            {
                this._container = container;
            }
    
            /// <summary>
            /// Gets a container
            /// </summary>
            public virtual IContainer Container
            {
                get
                {
                    return _container;
                }
            }
    
            /// <summary>
            /// Resolve
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="key">key</param>
            /// <param name="scope">Scope; pass null to automatically resolve the current scope</param>
            /// <returns>Resolved service</returns>
            public virtual T Resolve<T>(string key = "", ILifetimeScope scope = null) where T : class
            {
                if (scope == null)
                {
                    //no scope specified
                    scope = Scope();
                }
                if (string.IsNullOrEmpty(key))
                {
                    return scope.Resolve<T>();
                }
                return scope.ResolveKeyed<T>(key);
            }
    
            /// <summary>
            /// Resolve
            /// </summary>
            /// <param name="type">Type</param>
            /// <param name="scope">Scope; pass null to automatically resolve the current scope</param>
            /// <returns>Resolved service</returns>
            public virtual object Resolve(Type type, ILifetimeScope scope = null)
            {
                if (scope == null)
                {
                    //no scope specified
                    scope = Scope();
                }
                return scope.Resolve(type);
            }
    
            /// <summary>
            /// Resolve all
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="key">key</param>
            /// <param name="scope">Scope; pass null to automatically resolve the current scope</param>
            /// <returns>Resolved services</returns>
            public virtual T[] ResolveAll<T>(string key = "", ILifetimeScope scope = null)
            {
                if (scope == null)
                {
                    //no scope specified
                    scope = Scope();
                }
                if (string.IsNullOrEmpty(key))
                {
                    return scope.Resolve<IEnumerable<T>>().ToArray();
                }
                return scope.ResolveKeyed<IEnumerable<T>>(key).ToArray();
            }
    
            /// <summary>
            /// Resolve unregistered service
            /// </summary>
            /// <typeparam name="T">Type</typeparam>
            /// <param name="scope">Scope; pass null to automatically resolve the current scope</param>
            /// <returns>Resolved service</returns>
            public virtual T ResolveUnregistered<T>(ILifetimeScope scope = null) where T : class
            {
                return ResolveUnregistered(typeof(T), scope) as T;
            }
    
            /// <summary>
            /// Resolve unregistered service
            /// </summary>
            /// <param name="type">Type</param>
            /// <param name="scope">Scope; pass null to automatically resolve the current scope</param>
            /// <returns>Resolved service</returns>
            public virtual object ResolveUnregistered(Type type, ILifetimeScope scope = null)
            {
                if (scope == null)
                {
                    //no scope specified
                    scope = Scope();
                }
                var constructors = type.GetConstructors();
                foreach (var constructor in constructors)
                {
                    try
                    {
                        var parameters = constructor.GetParameters();
                        var parameterInstances = new List<object>();
                        foreach (var parameter in parameters)
                        {
                            var service = Resolve(parameter.ParameterType, scope);
                            if (service == null) throw new Exception("Unknown dependency");
                            parameterInstances.Add(service);
                        }
                        return Activator.CreateInstance(type, parameterInstances.ToArray());
                    }
                    catch (Exception)
                    {
                        // ignored
                    }
                }
                throw new Exception("No constructor  was found that had all the dependencies satisfied.");
            }
    
            /// <summary>
            /// Try to resolve srevice
            /// </summary>
            /// <param name="serviceType">Type</param>
            /// <param name="scope">Scope; pass null to automatically resolve the current scope</param>
            /// <param name="instance">Resolved service</param>
            /// <returns>Value indicating whether service has been successfully resolved</returns>
            public virtual bool TryResolve(Type serviceType, ILifetimeScope scope, out object instance)
            {
                if (scope == null)
                {
                    //no scope specified
                    scope = Scope();
                }
                return scope.TryResolve(serviceType, out instance);
            }
    
            /// <summary>
            /// Check whether some service is registered (can be resolved)
            /// </summary>
            /// <param name="serviceType">Type</param>
            /// <param name="scope">Scope; pass null to automatically resolve the current scope</param>
            /// <returns>Result</returns>
            public virtual bool IsRegistered(Type serviceType, ILifetimeScope scope = null)
            {
                if (scope == null)
                {
                    //no scope specified
                    scope = Scope();
                }
                return scope.IsRegistered(serviceType);
            }
    
            /// <summary>
            /// Resolve optional
            /// </summary>
            /// <param name="serviceType">Type</param>
            /// <param name="scope">Scope; pass null to automatically resolve the current scope</param>
            /// <returns>Resolved service</returns>
            public virtual object ResolveOptional(Type serviceType, ILifetimeScope scope = null)
            {
                if (scope == null)
                {
                    //no scope specified
                    scope = Scope();
                }
                return scope.ResolveOptional(serviceType);
            }
    
            /// <summary>
            /// Get current scope
            /// </summary>
            /// <returns>Scope</returns>
            public virtual ILifetimeScope Scope()
            {
                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);
                }
            }
        }
    View Code

    2.IDependencyRegistrar----注入的接口实现控制器等等都需要继承这个接口

        /// <summary>
        /// Dependency registrar interface
        /// </summary>
        public interface IDependencyRegistrar
        {
            /// <summary>
            /// Register services and interfaces
            /// </summary>
            /// <param name="builder">Container builder</param>
            /// <param name="typeFinder">Type finder</param>
            void Register(ContainerBuilder builder, ITypeFinder typeFinder);
    
            /// <summary>
            /// Order of this dependency registrar implementation
            /// </summary>
            int Order { get; }
        }
    View Code

    3.AppDomainTypeFinder----这个循环匹配所有匹配的程序集,项目名称不可以匹配其中的关键字 不然注入不了,自定义生成的程序集也可以添加到匹配列表里

        public class AppDomainTypeFinder : ITypeFinder
        {
            #region Fields
    
            private bool ignoreReflectionErrors = true;
            private bool loadAppDomainAssemblies = true;
            private string assemblySkipLoadingPattern = "^System|^mscorlib|^Microsoft|^AjaxControlToolkit|^Antlr3|^Autofac|^AutoMapper|^Castle|^ComponentArt|^CppCodeProvider|^DotNetOpenAuth|^EntityFramework|^EPPlus|^FluentValidation|^ImageResizer|^itextsharp|^log4net|^MaxMind|^MbUnit|^MiniProfiler|^Mono.Math|^MvcContrib|^Newtonsoft|^NHibernate|^nunit|^Org.Mentalis|^PerlRegex|^QuickGraph|^Recaptcha|^Remotion|^RestSharp|^Rhino|^Telerik|^Iesi|^TestDriven|^TestFu|^UserAgentStringLibrary|^VJSharpCodeProvider|^WebActivator|^WebDev|^WebGrease";
            private string assemblyRestrictToLoadingPattern = ".*";
            private IList<string> assemblyNames = new List<string>();
    
            #endregion
    
            #region Properties
    
            /// <summary>要查找的应用程序域</summary>
            public virtual AppDomain App
            {
                get { return AppDomain.CurrentDomain; }
            }
    
            /// <summary>获取或设置在加载类型时是否应该迭代应用程序域中的程序集。 加载模式在加载这些组件时应用。</summary>
            public bool LoadAppDomainAssemblies
            {
                get { return loadAppDomainAssemblies; }
                set { loadAppDomainAssemblies = value; }
            }
    
            /// <summary>除了在AppDomain中加载的组件之外,获取或设置组件加载的启动。</summary>
            public IList<string> AssemblyNames
            {
                get { return assemblyNames; }
                set { assemblyNames = value; }
            }
    
            /// <summary>获取我们知道不需要调查的dll的模式.</summary>
            public string AssemblySkipLoadingPattern
            {
                get { return assemblySkipLoadingPattern; }
                set { assemblySkipLoadingPattern = value; }
            }
    
            /// <summary>Gets or sets the pattern for dll that will be investigated. For ease of use this defaults to match all but to increase performance you might want to configure a pattern that includes assemblies and your own.</summary>
            /// <remarks>If you change this so that Nop assemblies arn't investigated (e.g. by not including something like "^Nop|..." you may break core functionality.</remarks>
            public string AssemblyRestrictToLoadingPattern
            {
                get { return assemblyRestrictToLoadingPattern; }
                set { assemblyRestrictToLoadingPattern = value; }
            }
    
            #endregion
    
            #region Methods
    
            public IEnumerable<Type> FindClassesOfType<T>(bool onlyConcreteClasses = true)
            {
                return FindClassesOfType(typeof(T), onlyConcreteClasses);
            }
    
            public IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, bool onlyConcreteClasses = true)
            {
                return FindClassesOfType(assignTypeFrom, GetAssemblies(), onlyConcreteClasses);
            }
    
            public IEnumerable<Type> FindClassesOfType<T>(IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true)
            {
                return FindClassesOfType(typeof(T), assemblies, onlyConcreteClasses);
            }
    
            public IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true)
            {
                var result = new List<Type>();
                try
                {
                    foreach (var a in assemblies)
                    {
                        Type[] types = null;
                        try
                        {
                            types = a.GetTypes();
                        }
                        catch
                        {
                            //Entity Framework 6 doesn't allow getting types (throws an exception)
                            if (!ignoreReflectionErrors)
                            {
                                throw;
                            }
                        }
                        if (types != null)
                        {
                            foreach (var t in types)
                            {
                                if (assignTypeFrom.IsAssignableFrom(t) || (assignTypeFrom.IsGenericTypeDefinition && DoesTypeImplementOpenGeneric(t, assignTypeFrom)))
                                {
                                    if (!t.IsInterface)
                                    {
                                        if (onlyConcreteClasses)
                                        {
                                            if (t.IsClass && !t.IsAbstract)
                                            {
                                                result.Add(t);
                                            }
                                        }
                                        else
                                        {
                                            result.Add(t);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch (ReflectionTypeLoadException ex)
                {
                    var msg = string.Empty;
                    foreach (var e in ex.LoaderExceptions)
                        msg += e.Message + Environment.NewLine;
    
                    var fail = new Exception(msg, ex);
                    Debug.WriteLine(fail.Message, fail);
    
                    throw fail;
                }
                return result;
            }
    
            /// <summary>Gets the assemblies related to the current implementation.</summary>
            /// <returns>A list of assemblies that should be loaded by the Nop factory.</returns>
            public virtual IList<Assembly> GetAssemblies()
            {
                var addedAssemblyNames = new List<string>();
                var assemblies = new List<Assembly>();
    
                if (LoadAppDomainAssemblies)
                    AddAssembliesInAppDomain(addedAssemblyNames, assemblies);
                AddConfiguredAssemblies(addedAssemblyNames, assemblies);
    
                return assemblies;
            }
    
            #endregion
    
            #region Utilities
    
            /// <summary>
            /// Iterates all assemblies in the AppDomain and if it's name matches the configured patterns add it to our list.
            /// </summary>
            /// <param name="addedAssemblyNames"></param>
            /// <param name="assemblies"></param>
            private void AddAssembliesInAppDomain(List<string> addedAssemblyNames, List<Assembly> assemblies)
            {
                foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    if (Matches(assembly.FullName))
                    {
                        if (!addedAssemblyNames.Contains(assembly.FullName))
                        {
                            assemblies.Add(assembly);
                            addedAssemblyNames.Add(assembly.FullName);
                        }
                    }
                }
            }
    
            /// <summary>
            /// Adds specifically configured assemblies.
            /// </summary>
            /// <param name="addedAssemblyNames"></param>
            /// <param name="assemblies"></param>
            protected virtual void AddConfiguredAssemblies(List<string> addedAssemblyNames, List<Assembly> assemblies)
            {
                foreach (string assemblyName in AssemblyNames)
                {
                    Assembly assembly = Assembly.Load(assemblyName);
                    if (!addedAssemblyNames.Contains(assembly.FullName))
                    {
                        assemblies.Add(assembly);
                        addedAssemblyNames.Add(assembly.FullName);
                    }
                }
            }
    
            /// <summary>
            /// Check if a dll is one of the shipped dlls that we know don't need to be investigated.
            /// </summary>
            /// <param name="assemblyFullName">
            /// The name of the assembly to check.
            /// </param>
            /// <returns>
            /// True if the assembly should be loaded into BotanicSystem.
            /// </returns>
            public virtual bool Matches(string assemblyFullName)
            {
                return !Matches(assemblyFullName, AssemblySkipLoadingPattern)
                       && Matches(assemblyFullName, AssemblyRestrictToLoadingPattern);
            }
    
            /// <summary>
            /// Check if a dll is one of the shipped dlls that we know don't need to be investigated.
            /// </summary>
            /// <param name="assemblyFullName">
            /// The assembly name to match.
            /// </param>
            /// <param name="pattern">
            /// The regular expression pattern to match against the assembly name.
            /// </param>
            /// <returns>
            /// True if the pattern matches the assembly name.
            /// </returns>
            protected virtual bool Matches(string assemblyFullName, string pattern)
            {
                return Regex.IsMatch(assemblyFullName, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
            }
    
            /// <summary>
            /// Makes sure matching assemblies in the supplied folder are loaded in the app domain.
            /// </summary>
            /// <param name="directoryPath">
            /// The physical path to a directory containing dlls to load in the app domain.
            /// </param>
            protected virtual void LoadMatchingAssemblies(string directoryPath)
            {
                var loadedAssemblyNames = new List<string>();
                foreach (Assembly a in GetAssemblies())
                {
                    loadedAssemblyNames.Add(a.FullName);
                }
    
                if (!Directory.Exists(directoryPath))
                {
                    return;
                }
    
                foreach (string dllPath in Directory.GetFiles(directoryPath, "*.dll"))
                {
                    try
                    {
                        var an = AssemblyName.GetAssemblyName(dllPath);
                        if (Matches(an.FullName) && !loadedAssemblyNames.Contains(an.FullName))
                        {
                            App.Load(an);
                        }
    
                        //old loading stuff
                        //Assembly a = Assembly.ReflectionOnlyLoadFrom(dllPath);
                        //if (Matches(a.FullName) && !loadedAssemblyNames.Contains(a.FullName))
                        //{
                        //    App.Load(a.FullName);
                        //}
                    }
                    catch (BadImageFormatException ex)
                    {
                        Trace.TraceError(ex.ToString());
                    }
                }
            }
    
            /// <summary>
            /// Does type implement generic?
            /// </summary>
            /// <param name="type"></param>
            /// <param name="openGeneric"></param>
            /// <returns></returns>
            protected virtual bool DoesTypeImplementOpenGeneric(Type type, Type openGeneric)
            {
                try
                {
                    var genericTypeDefinition = openGeneric.GetGenericTypeDefinition();
                    foreach (var implementedInterface in type.FindInterfaces((objType, objCriteria) => true, null))
                    {
                        if (!implementedInterface.IsGenericType)
                            continue;
    
                        var isMatch = genericTypeDefinition.IsAssignableFrom(implementedInterface.GetGenericTypeDefinition());
                        return isMatch;
                    }
                    return false;
                }
                catch
                {
                    return false;
                }
            }
    
            #endregion
        }
    View Code

    4.Engine 注入操作在这儿

        /// <summary>
        /// Engine
        /// </summary>
        public class Engine : IEngine
        {
            #region Fields
    
            private ContainerManager _containerManager;
    
            #endregion
    
            #region Utilities
    
            /// <summary>
            /// Run startup tasks
            /// </summary>
            protected virtual void RunStartupTasks()
            {
            }
    
            /// <summary>
            /// Register dependencies
            /// </summary>
            /// <param name="config">Config</param>
            protected virtual void RegisterDependencies()
            {
                var builder = new ContainerBuilder();
                var container = builder.Build();
                this._containerManager = new ContainerManager(container);
    
                //we create new instance of ContainerBuilder
                //because Build() or Update() method can only be called once on a ContainerBuilder.
    
                //dependencies
                var typeFinder = new WebAppTypeFinder();
                builder = new ContainerBuilder();
                builder.RegisterInstance(this).As<IEngine>().SingleInstance();
                builder.RegisterInstance(typeFinder).As<ITypeFinder>().SingleInstance();
                builder.Update(container);
    
                //register dependencies provided by other assemblies
                builder = new ContainerBuilder();
                var drTypes = typeFinder.FindClassesOfType<IDependencyRegistrar>();
                var drInstances = new List<IDependencyRegistrar>();
                foreach (var drType in drTypes)
                    drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType));
                //sort
                drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList();
                foreach (var dependencyRegistrar in drInstances)
                    dependencyRegistrar.Register(builder, typeFinder);
                builder.Update(container);
    
                //set dependency resolver
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            }
    
            #endregion
    
            #region Methods
    
            /// <summary>
            /// Initialize components and plugins in the nop environment.
            /// </summary>
            public void Initialize()
            {
                //register dependencies
                RegisterDependencies();
            }
    
            /// <summary>
            /// Resolve dependency
            /// </summary>
            /// <typeparam name="T">T</typeparam>
            /// <returns></returns>
            public T Resolve<T>() where T : class
            {
                return ContainerManager.Resolve<T>();
            }
    
            /// <summary>
            ///  Resolve dependency
            /// </summary>
            /// <param name="type">Type</param>
            /// <returns></returns>
            public object Resolve(Type type)
            {
                return ContainerManager.Resolve(type);
            }
    
            /// <summary>
            /// Resolve dependencies
            /// </summary>
            /// <typeparam name="T">T</typeparam>
            /// <returns></returns>
            public T[] ResolveAll<T>()
            {
                return ContainerManager.ResolveAll<T>();
            }
    
            #endregion
    
            #region Properties
    
            /// <summary>
            /// Container manager
            /// </summary>
            public ContainerManager ContainerManager
            {
                get { return _containerManager; }
            }
    
            #endregion
        }
    View Code

    5.EngineContext

        public class EngineContext
        {
            #region Methods
    
            /// <summary>
            /// 初始化静态实例
            /// </summary>
            /// <param name="forceRecreate">创建新的工厂实例</param>
            [MethodImpl(MethodImplOptions.Synchronized)]
            public static IEngine Initialize(bool forceRecreate)
            {
                if (Singleton<IEngine>.Instance == null || forceRecreate)
                {
                    Singleton<IEngine>.Instance = new Engine();
                    Singleton<IEngine>.Instance.Initialize();
                }
                return Singleton<IEngine>.Instance;
            }
    
            /// <summary>
            /// 替换引擎 实现自己的引擎
            /// </summary>
            /// <param name="engine"></param>
            /// <remarks></remarks>
            public static void Replace(IEngine engine)
            {
                Singleton<IEngine>.Instance = engine;
            }
    
            #endregion
    
            #region Properties
    
            /// <summary>
            /// 使用单例模式获取引擎,这样可以不用在构造函数中构造
            /// </summary>
            public static IEngine Current
            {
                get
                {
                    if (Singleton<IEngine>.Instance == null)
                    {
                        Initialize(false);
                    }
                    return Singleton<IEngine>.Instance;
                }
            }
    
            #endregion
        }
    View Code

    6.IEngine

        public interface IEngine
        {
            /// <summary>
            /// Container manager
            /// </summary>
            ContainerManager ContainerManager { get; }
    
            /// <summary>
            /// Initialize components  in the environment.
            /// </summary>
            void Initialize();
    
            /// <summary>
            /// Resolve dependency
            /// </summary>
            /// <typeparam name="T">T</typeparam>
            /// <returns></returns>
            T Resolve<T>() where T : class;
    
            /// <summary>
            ///  Resolve dependency
            /// </summary>
            /// <param name="type">Type</param>
            /// <returns></returns>
            object Resolve(Type type);
    
            /// <summary>
            /// Resolve dependencies
            /// </summary>
            /// <typeparam name="T">T</typeparam>
            /// <returns></returns>
            T[] ResolveAll<T>();
        }
    View Code

    7.ITypeFinder

        public interface ITypeFinder
        {
            IList<Assembly> GetAssemblies();
    
            IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, bool onlyConcreteClasses = true);
    
            IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true);
    
            IEnumerable<Type> FindClassesOfType<T>(bool onlyConcreteClasses = true);
    
            IEnumerable<Type> FindClassesOfType<T>(IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true);
        }
    View Code

    8.Singleton

        /// <summary>
        /// 一个标准化的方法来存储单个实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <remarks></remarks>
        public class Singleton<T> : Singleton
        {
            static T instance;
            public static T Instance
            {
                get { return instance; }
                set
                {
                    instance = value;
                    AllSingletons[typeof(T)] = value;
                }
            }
        }
    
        /// <summary>
        /// 提供某种类型的单例列表。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class SingletonList<T> : Singleton<IList<T>>
        {
            static SingletonList()
            {
                Singleton<IList<T>>.Instance = new List<T>();
            }
    
            /// <summary>对于指定类型T的单例实例。对于每种类型的T只有一个该列表的实例在该时间。</summary>
            public new static IList<T> Instance
            {
                get { return Singleton<IList<T>>.Instance; }
            }
        }
    
        /// <summary>
        /// 提供某个键值对类型的单例字典。
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <typeparam name="TValue"></typeparam>
        public class SingletonDictionary<TKey, TValue> : Singleton<IDictionary<TKey, TValue>>
        {
            static SingletonDictionary()
            {
                Singleton<Dictionary<TKey, TValue>>.Instance = new Dictionary<TKey, TValue>();
            }
    
            public new static IDictionary<TKey, TValue> Instance
            {
                get { return Singleton<Dictionary<TKey, TValue>>.Instance; }
            }
        }
    
        /// <summary>
        /// 提供对存储的所有“单例”的访问 <see cref="Singleton{T}"/>.
        /// </summary>
        public class Singleton
        {
            static Singleton()
            {
                allSingletons = new Dictionary<Type, object>();
            }
    
            static readonly IDictionary<Type, object> allSingletons;
    
            public static IDictionary<Type, object> AllSingletons
            {
                get { return allSingletons; }
            }
        }
    View Code

    9.WebAppTypeFinder

        public class WebAppTypeFinder : AppDomainTypeFinder
        {
            #region Fields
    
            private bool _ensureBinFolderAssembliesLoaded = true;
            private bool _binFolderAssembliesLoaded;
    
            #endregion
    
            #region Properties
    
            /// <summary>
            /// 获取或设置是否应特别检查Web应用程序的bin文件夹中的程序集是否在应用程序加载时加载。
            /// 这在需要在应用程序重新加载后需要在AppDomain中加载插件的情况下需要。
            /// </summary>
            public bool EnsureBinFolderAssembliesLoaded
            {
                get { return _ensureBinFolderAssembliesLoaded; }
                set { _ensureBinFolderAssembliesLoaded = value; }
            }
    
            #endregion
    
            #region Methods
    
            /// <summary>
            ///获取bin的物理路径
            /// </summary>
            /// <returns></returns>
            public virtual string GetBinDirectory()
            {
                if (HostingEnvironment.IsHosted)
                {
                    //hosted
                    return HttpRuntime.BinDirectory;
                }
    
                //not hosted. For example, run either in unit tests
                return AppDomain.CurrentDomain.BaseDirectory;
            }
    
            public override IList<Assembly> GetAssemblies()
            {
                if (this.EnsureBinFolderAssembliesLoaded && !_binFolderAssembliesLoaded)
                {
                    _binFolderAssembliesLoaded = true;
                    string binPath = GetBinDirectory();
                    //binPath = _webHelper.MapPath("~/bin");
                    LoadMatchingAssemblies(binPath);
                }
    
                return base.GetAssemblies();
            }
    
            #endregion
        }
    View Code

    -------------------------------------------------------------------------------------------------------------------

    注入一些常用的,还有最重要的控制器

        public class DependencyRegistrar : IDependencyRegistrar
        {
            public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
            {
                builder.Register(c => c.Resolve<HttpContextBase>().Request)
                    .As<HttpRequestBase>()
                    .InstancePerLifetimeScope();
                builder.Register(c => c.Resolve<HttpContextBase>().Response)
                    .As<HttpResponseBase>()
                    .InstancePerLifetimeScope();
                builder.Register(c => c.Resolve<HttpContextBase>().Server)
                    .As<HttpServerUtilityBase>()
                    .InstancePerLifetimeScope();
                builder.Register(c => c.Resolve<HttpContextBase>().Session)
                    .As<HttpSessionStateBase>()
                    .InstancePerLifetimeScope();
    
                //controllers
                builder.RegisterControllers(typeFinder.GetAssemblies().ToArray());
            }
    
            /// <summary>
            /// Order of this dependency registrar implementation
            /// </summary>
            public int Order
            {
                get { return 0; }
            }
        }
    View Code

    -------------------------------------------------------------------------------------------------------------------

    Global.asax.cs

            protected void Application_Start()
            {
                EngineContext.Initialize(false);
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
            }
    View Code

    -------------------------------------------------------------------------------------------------------------------

    使用

    1. var logger =  EngineContext.Current.Resolve<ILogger>()

    2.HomeController

            #region
    
            private readonly ICalabashService _calabashService;
            #endregion
    
            public HomeController(ICalabashService calabashService)
            {
                _calabashService = calabashService;
            }
    
            public ActionResult Calabash()
            {
                return Content(_calabashService.Calabash());
            }
    View Code

    over

  • 相关阅读:
    YYHS-吴传之火烧连营(梦回三国系列T3)(trie树)
    YYHS-蜀传之单刀赴会(梦回三国系列T2)(最短路+状压dp)
    YYHS-魏传之长坂逆袭(梦回三国系列T1)
    BZOJ-2330-[SCOI2011]糖果(差分约束)
    BZOJ-1864-[Zjoi2006]三色二叉树(树形dp)
    YYHS-分数(二分+容斥)
    YYHS-猜数字(并查集/线段树维护)
    BZOJ-1225-[HNOI2001] 求正整数
    NOIP2014-飞扬的小鸟(DP)
    欧几里得距离、曼哈顿距离和切比雪夫距离
  • 原文地址:https://www.cnblogs.com/sunzgod/p/6198061.html
Copyright © 2011-2022 走看看