/// <summary> /// 应用一个模块,当 A 使用 B 时, A 就是 target ,B 就是 appModule /// </summary> /// <param name="target"></param> /// <param name="appModule"></param> private void Use(IAppModule target, IAppModule appModule) { IEnumerable <AttributeAndTypeInfo> targetInfos = this.scanner.Scan(target); var arguments = PluginInvoker <AppModuleUsingArguments> .SetArgument(new AppModuleUsingArguments(this, appModule, target, targetInfos)) .SetPlugins(this.Plugins) .Invoke((p, args) => p.OnAppModuleBeforeUsing(this, args)); appModule.OnUsing(arguments); PluginInvoker <OnAppModuleUsedArguments> .SetArgument(new OnAppModuleUsedArguments(appModule)) .SetPlugins(this.Plugins) .Invoke((p, args) => p.OnAppModuleUsed(this, args)); IEnumerable <IAppModule> dependentModules = appModule.DependentModules; if (dependentModules == null || !dependentModules.Any()) { return; } foreach (IAppModule subAppModule in dependentModules) { this.Use(appModule, subAppModule); } }