為了使用方便,對Autofac container的簡單封裝,記錄如下,備以後用或分享給大家,歡迎討論!
1 using Autofac; 2 using Autofac.Core.Lifetime; 3 using Autofac.Integration.Mvc; 4 5 public static class ContainerManager 6 { 7 private static IContainer _container; 8 9 public static void SetContainer(IContainer container) 10 { 11 _container = container; 12 } 13 14 public static IContainer Container 15 { 16 get { return _container; } 17 } 18 19 public static T Resolve<T>(string key = "", ILifetimeScope scope = null) where T : class 20 { 21 if (scope == null) 22 { 23 //no scope specified 24 scope = Scope(); 25 } 26 if (string.IsNullOrEmpty(key)) 27 { 28 return scope.Resolve<T>(); 29 } 30 return scope.ResolveKeyed<T>(key); 31 } 32 33 public static object Resolve(Type type, ILifetimeScope scope = null) 34 { 35 if (scope == null) 36 { 37 //no scope specified 38 scope = Scope(); 39 } 40 return scope.Resolve(type); 41 } 42 43 public static T[] ResolveAll<T>(string key = "", ILifetimeScope scope = null) 44 { 45 if (scope == null) 46 { 47 //no scope specified 48 scope = Scope(); 49 } 50 if (string.IsNullOrEmpty(key)) 51 { 52 return scope.Resolve<IEnumerable<T>>().ToArray(); 53 } 54 return scope.ResolveKeyed<IEnumerable<T>>(key).ToArray(); 55 } 56 57 public static T ResolveUnregistered<T>(ILifetimeScope scope = null) where T : class 58 { 59 return ResolveUnregistered(typeof(T), scope) as T; 60 } 61 62 public static object ResolveUnregistered(Type type, ILifetimeScope scope = null) 63 { 64 if (scope == null) 65 { 66 //no scope specified 67 scope = Scope(); 68 } 69 var constructors = type.GetConstructors(); 70 foreach (var constructor in constructors) 71 { 72 try 73 { 74 var parameters = constructor.GetParameters(); 75 var parameterInstances = new List<object>(); 76 foreach (var parameter in parameters) 77 { 78 var service = Resolve(parameter.ParameterType, scope); 79 if (service == null) throw new ArgumentException("Unkown dependency"); 80 parameterInstances.Add(service); 81 } 82 return Activator.CreateInstance(type, parameterInstances.ToArray()); 83 } 84 catch (ArgumentException) 85 { 86 87 } 88 } 89 throw new ArgumentException("在所有的依賴項中,未找到合適的構造函數。"); 90 } 91 92 public static bool TryResolve(Type serviceType, ILifetimeScope scope, out object instance) 93 { 94 if (scope == null) 95 { 96 //no scope specified 97 scope = Scope(); 98 } 99 return scope.TryResolve(serviceType, out instance); 100 } 101 102 public static bool IsRegistered(Type serviceType, ILifetimeScope scope = null) 103 { 104 if (scope == null) 105 { 106 //no scope specified 107 scope = Scope(); 108 } 109 return scope.IsRegistered(serviceType); 110 } 111 112 public static object ResolveOptional(Type serviceType, ILifetimeScope scope = null) 113 { 114 if (scope == null) 115 { 116 //no scope specified 117 scope = Scope(); 118 } 119 return scope.ResolveOptional(serviceType); 120 } 121 122 public static ILifetimeScope Scope() 123 { 124 try 125 { 126 if (HttpContext.Current != null) 127 return AutofacDependencyResolver.Current.RequestLifetimeScope; 128 129 //when such lifetime scope is returned, you should be sure that it'll be disposed once used (e.g. in schedule tasks) 130 return Container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag); 131 } 132 catch (Exception) 133 { 134 //we can get an exception here if RequestLifetimeScope is already disposed 135 //for example, requested in or after "Application_EndRequest" handler 136 //but note that usually it should never happen 137 138 //when such lifetime scope is returned, you should be sure that it'll be disposed once used (e.g. in schedule tasks) 139 return Container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag); 140 } 141 } 142 }
使用方法如下:
1 /// <summary> 2 /// IOCConfig 3 /// </summary> 4 public class IOCConfig 5 { 6 /// <summary> 7 /// RegisterAll 8 /// </summary> 9 public static void RegisterAll() 10 { 11 var iocBuilder = new Autofac.ContainerBuilder(); 12 13 //todo:為了能編譯到web目錄,並且發布方便,才在web項目中引用repository項目,在代碼中不要直接使用之 14 iocBuilder.RegisterModule<RIS.Infrastructure.RegisterModule>(); 15 iocBuilder.RegisterModule<RIS.Biz.RegisterModule>(); 16 iocBuilder.RegisterModule<RIS.Repository.RegisterModule>(); 17 18 iocBuilder.Register((c, p) => new WebWorkContext(p.Named<string>("userToken"))) 19 .As<RIS.Biz.Core.IWorkContext>() 20 .InstancePerLifetimeScope(); 21 22 23 iocBuilder.RegisterControllers(Assembly.GetExecutingAssembly()); 24 25 iocBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 26 27 //iocBuilder.RegisterModelBinders(Assembly.GetExecutingAssembly()); 28 //iocBuilder.RegisterModelBinderProvider(); 29 //iocBuilder.RegisterModule<AutofacWebTypesModule>(); 30 var config = GlobalConfiguration.Configuration; 31 iocBuilder.RegisterWebApiFilterProvider(config); 32 IContainer iocContainer = iocBuilder.Build(); 33 config.DependencyResolver = new AutofacWebApiDependencyResolver(iocContainer); 34 System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(iocContainer)); 35 36 37 RIS.Biz.Core.ContainerManager.SetContainer(iocContainer); 38 } 39 } 40 41 // 注意: 有關啟用 IIS6 或 IIS7 經典模式的說明, 42 // 請訪問 http://go.microsoft.com/?LinkId=9394801 43 /// <summary> 44 /// MvcApplication 45 /// </summary> 46 public class MvcApplication : System.Web.HttpApplication 47 { 48 /// <summary> 49 /// 程序啟動入口 50 /// </summary> 51 protected void Application_Start() 52 { 53 IOCConfig.RegisterAll(); 54 55 AreaRegistration.RegisterAllAreas(); 56 57 WebApiConfig.Register(GlobalConfiguration.Configuration); 58 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 59 RouteConfig.RegisterRoutes(RouteTable.Routes); 60 BundleConfig.RegisterBundles(BundleTable.Bundles); 61 } 62 }