using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Mvc; using Autofac; using Autofac.Integration.Mvc; using Autofac.Integration.WebApi; namespace PalGain.Core { public class PalGainEngine { private static PalGainEngine g_instance = null; private ContainerManager _containerManager; public static PalGainEngine Instance { get { if (g_instance == null) { g_instance = new PalGainEngine(); } return g_instance; } } public IContainer Container { get; private set; } public void Register() { var Builder = new ContainerBuilder(); Container = Builder.Build(); var typeFinder = new WebAppTypeFinder(); Builder = new ContainerBuilder(); //发现类型IDependencyRegistrar的实现类 var drTypes = typeFinder.FindClassesOfType(); var drInstances = new List(); foreach (var drType in drTypes) { drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType)); } //查询能力 drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); foreach (var dependencyRegister in drInstances) { //依赖登记 dependencyRegister.Register(Builder, typeFinder); } Builder.Update(Container); _containerManager = new ContainerManager(Container); DependencyResolver.SetResolver(new AutofacDependencyResolver(Container)); } public void RegisterWebApi() { var Builder = new ContainerBuilder(); Container = Builder.Build(); var typeFinder = new WebAppTypeFinder(); Builder = new ContainerBuilder(); var drTypes = typeFinder.FindClassesOfType(); var drInstances = new List(); foreach (var drType in drTypes) { drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType)); } drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList(); foreach (var dependencyRegister in drInstances) { dependencyRegister.Register(Builder, typeFinder); } Builder.Update(Container); _containerManager = new ContainerManager(Container); } public ContainerManager ContainerManager { get { return _containerManager; } } public T Resolve() where T : class { return ContainerManager.Resolve(); } public object Resolve(Type type) { return ContainerManager.Resolve(type); } public T ResolveNamed(string key = "") where T : class { return ContainerManager.Resolve(key); } } }