构建和发布angular2模块

时间:2017-03-07 14:39:36

标签: angular typescript dependency-injection npm angular2-modules

我为angular2编写了一个远程记录器,工作正常。我现在想将它作为自己的npm库发布,并努力使其可用。我专注于ngx-translate模块的设置。

我在内部使用的记录器的常规设置类似于Ben Nadel's Custom Error Handler Post中描述的记录器:

import {
  LOG4NG_SERVICE_HANDLER_PROVIDERS,
  LOG4NG_SERVICE_CONFIG,
  LOG4NG_ERROR_HANDLER_PROVIDERS,
  LOG4NG_ERROR_HANDLER_CONFIG } from './log4ng.service';
import * as message from './log4ng.service/message';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [
    LOG4NG_SERVICE_HANDLER_PROVIDERS,
    {
      provide: LOG4NG_SERVICE_CONFIG,
      useValue: {
        recipients: [
          {
            classname: 'ConsoleWriter',
            params: {
              name: 'Angular2 Test App::Console Logger'
            }
          }
        ],
        filters: [ /** filter definition **/ ]
      }
    },

    LOG4NG_ERROR_HANDLER_PROVIDERS,
    {
      provide: LOG4NG_ERROR_HANDLER_CONFIG,
      useValue: {
        rethrowError: false,
        unwrapError: false
      }
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

我试图将这种方法改编成它自己的模块,如下所示:

import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
import {
  Log4ngService,
  ILog4ngServiceConfig,
  LOG4NG_SERVICE_CONFIG,
  LOG4NG_SERVICE_HANDLER_PROVIDERS,
  ErrorHandlerLoggingService,
  LOG4NG_ERROR_HANDLER_CONFIG,
  LOG4NG_ERROR_HANDLER_PROVIDERS
} from './src';

export * from './src';

@NgModule({
  imports: [
    CommonModule
  ],
  providers: [
    Log4ngService,
    ErrorHandlerLoggingService
  ]
})
export class Log4ngModule {
    static forRoot(config: ILog4ngServiceConfig = LOG4NG_SERVICE_CONFIG): ModuleWithProviders {
        return {
            ngModule: Log4ngModule,
            providers: LOG4NG_SERVICE_HANDLER_PROVIDERS
        };
    }

    static forChild(config: ILog4ngServiceConfig = LOG4NG_SERVICE_CONFIG): ModuleWithProviders {
        return {
            ngModule: Log4ngModule,
            providers: LOG4NG_SERVICE_HANDLER_PROVIDERS
        };
    }
}

我继续创建一个演示应用程序来使用这个模块,并使用npm link在本地使用该库。虽然它完全构建,但在尝试在演示应用程序中使用它时,我收到运行时错误:

Error: Can't resolve all parameters for Log4ngService: (?)

我不明白,因为根据我的理解,所有必要的DI令牌都已正确设置。

您可以在此git-repository的dev-branch中找到代码:https://github.com/LarsKumbier/log4ng/tree/dev

任何帮助和提示都表示赞赏 - 提前感谢!

1 个答案:

答案 0 :(得分:0)

由于问题出在Log4ngService,您可以像这样使用工厂

  /** Log4ngService factory */
    export function Log4ngServiceFactory(config: ILog4ngServiceConfig ) {
        return new Log4ngService (config);
    }  

    @NgModule({
      imports: [
        CommonModule
      ],
      providers: [
        ErrorHandlerLoggingService
      ]
    })
    export class Log4ngModule {
         static forRoot(config: ILog4ngServiceConfig = LOG4NG_SERVICE_CONFIG): ModuleWithProviders {
                return {
                    ngModule: Log4ngModule,
                    providers: [
                    { 
                       provide: Log4ngService,
                       useFactory: Log4ngServiceFactory,
                       deps : [config]
                    } 
                   ]
                };
            }
  }