如何从 AppModule 级别的共享库中获取提供的服务?角

Posted

技术标签:

【中文标题】如何从 AppModule 级别的共享库中获取提供的服务?角【英文标题】:How to get a provided service from shared library in AppModule level? Angular 【发布时间】:2021-08-09 04:38:24 【问题描述】:

我正在尝试创建一个 Guard 服务来验证我的路由。但我的守卫服务位于共享库中。

这是我的警卫服务:

@Injectable(
  providedIn: 'root'
)
export class RouteGuard implements CanActivate 
  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): boolean 
    return true;
  
  

在共享模块中提供:

import RouteGuard from './auth/guard/route.guard';

@NgModule(
  imports: [CommonModule, MaterialModule],
  exports: [MaterialModule],
  providers: [RouteGuard]
)
export class SharedModule 

现在我需要在 app 模块中获得这项提供的服务。我该怎么做?

import SharedModule from '@acn-collections-ws/shared';

@NgModule(
  declarations: [AppComponent, AuthComponent, LoggedComponent, HomeComponent, LoginComponent, SigninComponent],
  imports: [BrowserModule, BrowserAnimationsModule, AppRoutingModule, SharedModule],
  providers: [],
  bootstrap: [AppComponent],
  exports: [
    AuthComponent,
    LoggedComponent,
    HomeComponent,
    LoginComponent,
    SigninComponent
  ],
)
export class AppModule 

我需要在我的应用路由模块中导入此服务,并与 canActivate 路由验证器一起使用。像这样:

// i cant found RouteGuard at acn-collections-ws/shared
import  RouteGuard  from '@acn-collections-ws/shared';
const routes: Routes = [
  
    path: '',
    component: LoggedComponent,
    children: [
      path: '', component: HomeComponent
    ],
    canActivate: [RouteGuard]
  ,
  
    path: '',
    component: AuthComponent,
    children: [
      path: '', redirectTo: 'login', pathMatch: 'full',
      path: 'login', component: LoginComponent,
      path: 'signin', component: SigninComponent
    ]
  

];

【问题讨论】:

你为什么在'@acn-collections-ws/shared' 中寻找RouteGuard ?不是来自'some_way/auth/guard/route.guard' 吗? 我的守卫位于共享库@acn-collections-ws/shared 我正在使用 @nwrl 库 --preset=angular。有了这个,我可以使用@ 导入外部库 你能创建一个最小的可验证stackblitz 示例吗? 我今天以后会尝试这样做。谢谢兄弟! 【参考方案1】:

好的,我找到了。

@NgModule(
  imports: [CommonModule, MaterialModule],
  exports: [MaterialModule],
  providers: [RouteGuard]
)
export class SharedModule 

我需要从共享库的 index.ts 导出guard.module。 (我没有导出保护模块)。

export * from './lib/guard.module';

并且知道它有效

// Service guard
import RouteGuard from '@acn-collections-ws/shared';

【讨论】:

以上是关于如何从 AppModule 级别的共享库中获取提供的服务?角的主要内容,如果未能解决你的问题,请参考以下文章

如何从延迟加载的模块访问 AppModule 模块导入?

如何从 Azure 文件共享中获取文件元数据?

如何在共享库中获取正确的函数名?

如何在 C++ 共享库中隐藏业务对象的实现细节并提供接口

如何在共享库中管理 spring-cloud 引导属性?

如何在共享库中找到 C++ isfinite() 的解析位置?