在之前的ASP.NET MVC實現依賴註入一文中,通過替換預設的ControllerFactory來達到對Controller生命周期的攔截,實現自定義的對象註入,在NetCore3.0中需要重新實現,步驟如下: 1.獲取所有相關業務程式集 public static List<Assembly> ...
在之前的ASP.NET MVC實現依賴註入一文中,通過替換預設的ControllerFactory來達到對Controller生命周期的攔截,實現自定義的對象註入,在NetCore3.0中需要重新實現,步驟如下:
1.獲取所有相關業務程式集
public static List<Assembly> GetFrameworkAssemblys() { var list = new List<Assembly>(); var deps = DependencyContext.Default; var libs = deps.CompileLibraries; foreach (var lib in libs) { if (!lib.Serviceable && lib.Type != "package" && lib.Name.StartsWith("FastCloud")) { var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name)); list.Add(assembly); } } return list; }
2.對所有Component組件註冊
public class InjectContext { private static ContainerBuilder Container; public static void Init() { InjectFrameWork(); } public static void InjectFrameWork() { Container = new ContainerBuilder(); //獲框架取所有程式集 List<Assembly> assemblies = CloudUtil.GetFrameworkAssemblys(); //註入框架所有Component組件 Container.RegisterAssemblyTypes(assemblies.ToArray(), typeof(Component), true); Container.Build(CotainerEnum.BuidlModel.OverWrite); } public static object Resolve(Type Type, CotainerEnum.TypeEqual TypeEqual = CotainerEnum.TypeEqual.Ref) { return Container.Resolve(Type, TypeEqual); } public static List<Type> GetRegistType(Type @Type) { return Container.GetRegistType(@Type); } }
3.實現自定義Controller工廠
public class CloudControllerActivator : IControllerActivator { public object Create(ControllerContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (context.ActionDescriptor == null) { throw new ArgumentException(nameof(ControllerContext.ActionDescriptor)); } var controllerTypeInfo = context.ActionDescriptor.ControllerTypeInfo; if (controllerTypeInfo == null) { throw new ArgumentException(nameof(context.ActionDescriptor.ControllerTypeInfo)); } Type controllerType = controllerTypeInfo.AsType(); return InjectContext.Resolve(controllerType); } public void Release(ControllerContext context, object controller) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (controller == null) { throw new ArgumentNullException(nameof(controller)); } var disposable = controller as IDisposable; if (disposable != null) { disposable.Dispose(); } } }
4.修改配置,使用自定義Controller工廠
//替換預設Controller工廠 var defaultActivator = services.FirstOrDefault(c => c.ServiceType == typeof(IControllerActivator)); if (defaultActivator != null) { services.Remove(defaultActivator); } services.AddSingleton<IControllerActivator, CloudControllerActivator>();