export interface IPortResolver { resolve<T>(name : string) : T; }
import { IPortResolver } from '../ports/IPortResolver'; class BaseResolver implements IPortResolver { resolve<T>(name: string): T { return this.resolver.resolve(name); } protected resolver: IPortResolver; public setPortResolver(portResolver: IPortResolver) { this.resolver = portResolver; } }
class AppDomain extends BaseResolver { get IRequestUserSession() { return this.resolve<IRequestUserSession>("IRequestUserSession"); } get IRequestRefreshSession() { return this.resolve<IRequestRefreshSession>("IRequestRefreshSession"); } get IRequestClearUserSession() { return this.resolve<IRequestClearUserSession>("IRequestClearUserSession"); } get IHandleExceptions() { return this.resolve<IHandleExceptions>("IHandleExceptions"); } get INavigator() { return this.resolve<INavigator>("INavigator"); } get IEventHandler() { return this.resolve<IEventHandler>("IEventHandler"); } get IEventEmitter() { return this.resolve<IEventEmitter>("IEventEmitter"); } } export const appDomain = new AppDomain();
import { IPortResolver } from '../ports/IPortResolver'; export class PortResolver implements IPortResolver { private _container : any = {}; constructor() { } register<T>(name, fn : () => T) { this._container[name] = fn; } registerInstance<T>(name, fn : () => T) { let _instance = null; let getInstance = (fn) => { return () => { if (!_instance) { _instance = fn(); } return _instance; }; }; this._container[name] = getInstance(fn); } resolve<T>(name : string) : T { if (name in this._container && typeof this._container[name] == 'function') { return this._container[name]() as T; } throw new Error('PortResolver can not resolve '+ name); } }
import { PortResolver } from "../adapters/PortResolver"; import { appDomain } from "../domain/AppDomain"; import { Injectable, NgModule, ComponentFactoryResolver } from "@angular/core"; import { AngularHttpClientPlug } from "../adapters/AngularAdapter/AngularHttpClientPlug"; import { HttpClient } from "@angular/common/http"; import { SweetAlertPlug } from "../adapters/PresentationAdapter/SweetAlertPlug"; import { AngularRoutingPlug } from "../adapters/AngularAdapter/AngularRoutingPlug"; import { Router } from "@angular/router"; import { NgBlockUI, BlockUI } from "ng-block-ui"; import { TokenManagerPlug } from "../adapters/TokenManagerAdapter/TokenManagerPlug"; import { ClipboardPlug } from "../adapters/DomAdapter/ClipboardPlug"; import { IHttpClient } from '../ports/IHttpClient'; import { ICanNavigate } from '../ports/ICanNavigate'; import { ICanManageToken } from '../ports/ICanManageToken'; import { ICanCopyToClipboard } from '../ports/ICanCopyToClipboard'; import { ICanCheckPermissions } from '../ports/ICanCheckPermissions'; import { PermissionsPlug } from '../adapters/PermissionsAdapter/PermissionsPlug'; import { ICanDoHttpRequests } from '../ports/ICanDoHttpRequests'; import { HttpRequestPlug } from '../adapters/HttpRequestAdapter/HttpRequestPlug'; import { ICanGiveUserTypes } from '../ports/ICanGiveUserTypes'; import { UserTypePlug } from '../adapters/WebApiAdapter/UserTypePlug'; import { NotifierPlug } from '../adapters/PresentationAdapter/NotifierPlug'; import { ICanNotify } from '../ports/ICanNotify'; import { ICanGiveApiInfo } from '../ports/ICanGiveApiInfo'; import { ApiInfoPlug } from '../adapters/WebApiAdapter/ApiInfoPlug'; import { ICanShowAlert } from '../ports/ICanShowAlert'; import { ICanShowDialog } from '../ports/IDialogAdapter'; import { DialogPlug } from '../adapters/PresentationAdapter/DialogPlug'; import { ICanTranslate } from '../ports/ICanTranslate'; import { TranslationPlug } from '../adapters/TranslationAdapter/TranslationPlug'; import { ICanCRUDStorage } from '../ports/ICanCRUDStorage'; import { LocalStoragePlug } from '../adapters/LocalStorageAdapter/LocalStoragePlug'; import { ICanCRUDTransformation } from '../ports/ICanCRUDTransformation'; import { TransformationPlug } from '../adapters/WebApiAdapter/TransformationPlug'; import { ICanCRUDUser } from '../ports/ICanCRUDUser'; import { UserPlug } from '../adapters/WebApiAdapter/UserPlug'; import { ICanGetCurrentUser } from '../ports/ICanGetCurrentUser'; import { CurrentUserPlug } from '../adapters/WebApiAdapter/CurrentUserPlug'; import { ICanBlockUI } from '../ports/ICanBlockUI'; import { NgBlockUiPlug } from '../adapters/PresentationAdapter/NgBlockUiPlug'; import { ICanTransceiveEvents } from '../ports/ICanTransceiveEvents'; import { EventPlug } from '../adapters/EventAdapter/EventPlug'; import { ICanChangePasswords } from '../ports/ICanChangePasswords'; import { ChangePasswordPlug } from '../adapters/WebApiAdapter/ChangePasswordPlug'; import { ICanGeneratePassword } from '../ports/ICanGeneratePassword'; import { GeneratePasswordPlug } from '../adapters/WebApiAdapter/GeneratePasswordPlug'; @Injectable() export class Wiring { @BlockUI() blockUI: NgBlockUI; getBaseUrl() { let baseUrl = "http://localhost:9125"; if ((window as any).config) { baseUrl = (window as any).config.WebApiUrl || "http://localhost:9125"; } return baseUrl; } constructor(httpClient: HttpClient, componentFactoryResolver: ComponentFactoryResolver, router: Router) { let blockUI = this.blockUI; const portResolver = new PortResolver(); portResolver.registerInstance<IHttpClient>('IHttpClient', () => new AngularHttpClientPlug(httpClient)); portResolver.registerInstance<ICanNavigate>('ICanNavigate', () => new AngularRoutingPlug(router)); portResolver.registerInstance<ICanManageToken>('ICanManageToken', () => new TokenManagerPlug(this.getBaseUrl() + "/token")); portResolver.registerInstance<ICanCopyToClipboard>('ICanCopyToClipboard', () => new ClipboardPlug()); portResolver.registerInstance<ICanCheckPermissions>('ICanCheckPermissions', () => new PermissionsPlug()); portResolver.register<ICanDoHttpRequests>('ICanDoHttpRequests', () => new HttpRequestPlug(this.getBaseUrl())); portResolver.register<ICanGiveUserTypes>('ICanGiveUserTypes', () => new UserTypePlug()); portResolver.register<ICanNotify>('ICanNotify', () => new NotifierPlug()); portResolver.register<ICanGiveApiInfo>('ICanGiveApiInfo', () => new ApiInfoPlug()); portResolver.register<ICanShowAlert>('ICanShowAlert', () => new SweetAlertPlug()); portResolver.register<ICanShowDialog>('ICanShowDialog', () => new DialogPlug(componentFactoryResolver)); portResolver.registerInstance<ICanTranslate>('ICanTranslate', () => new TranslationPlug()); portResolver.register<ICanCRUDStorage>('ICanCRUDStorage', () => new LocalStoragePlug()); portResolver.register<ICanCRUDUser>('ICanCRUDUser', () => new UserPlug()); portResolver.register<ICanCRUDTransformation>('ICanCRUDTransformation', () => new TransformationPlug()); portResolver.registerInstance<ICanGetCurrentUser>('ICanGetCurrentUser', () => new CurrentUserPlug()); portResolver.register<ICanBlockUI>('ICanBlockUI', () => new NgBlockUiPlug(blockUI)); portResolver.register<ICanTransceiveEvents>('ICanTransceiveEvents', () => new EventPlug()); portResolver.registerInstance<ICanChangePasswords>('ICanChangePasswords', () => new ChangePasswordPlug()); portResolver.register<ICanGeneratePassword>('ICanGeneratePassword', () => new GeneratePasswordPlug()); appDomain.setPortResolver(portResolver); } }
110000cookie-checkTypescript: Dependency Injection / Port Resolver