{"id":1100,"date":"2018-05-17T08:35:30","date_gmt":"2018-05-17T07:35:30","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=1100"},"modified":"2019-08-12T10:07:44","modified_gmt":"2019-08-12T09:07:44","slug":"typescript-dependency-injection-port-resolver","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/typescript-dependency-injection-port-resolver\/","title":{"rendered":"Typescript: Dependency Injection \/ Port Resolver"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">export interface IPortResolver {\n    resolve&lt;T>(name : string) : T;\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { IPortResolver } from '..\/ports\/IPortResolver';\n\nclass BaseResolver implements IPortResolver {\n    resolve&lt;T>(name: string): T { return this.resolver.resolve(name); }\n    protected resolver: IPortResolver;\n    public setPortResolver(portResolver: IPortResolver) {\n        this.resolver = portResolver;\n    }\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class AppDomain extends BaseResolver {\n    get IRequestUserSession() { return this.resolve&lt;IRequestUserSession>(\"IRequestUserSession\"); }\n    get IRequestRefreshSession() { return this.resolve&lt;IRequestRefreshSession>(\"IRequestRefreshSession\"); }\n    get IRequestClearUserSession() { return this.resolve&lt;IRequestClearUserSession>(\"IRequestClearUserSession\"); }\n    get IHandleExceptions() { return this.resolve&lt;IHandleExceptions>(\"IHandleExceptions\"); }\n    get INavigator() { return this.resolve&lt;INavigator>(\"INavigator\"); }\n    get IEventHandler() { return this.resolve&lt;IEventHandler>(\"IEventHandler\"); }\n    get IEventEmitter() { return this.resolve&lt;IEventEmitter>(\"IEventEmitter\"); }    \n}\n\nexport const appDomain = new AppDomain();\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { IPortResolver } from '..\/ports\/IPortResolver';\n\nexport class PortResolver implements IPortResolver {\n    private _container : any = {};\n    constructor() {\n\n    }\n    register&lt;T>(name, fn : () => T) {\n        this._container[name] = fn;\n    }\n    registerInstance&lt;T>(name, fn : () => T) {\n        let _instance = null;\n        let getInstance = (fn) => {\n            return () => {\n                if (!_instance) {\n                    _instance = fn();\n                }\n                return _instance;\n            };\n        };\n        this._container[name] = getInstance(fn);\n    }\n    resolve&lt;T>(name : string) : T {\n        if (name in this._container &amp;&amp; typeof this._container[name] == 'function') {\n            return this._container[name]() as T;\n        }\n        throw new Error('PortResolver can not resolve '+ name);\n    }\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import { PortResolver } from \"..\/adapters\/PortResolver\";\nimport { appDomain } from \"..\/domain\/AppDomain\";\nimport { Injectable, NgModule, ComponentFactoryResolver } from \"@angular\/core\";\nimport { AngularHttpClientPlug } from \"..\/adapters\/AngularAdapter\/AngularHttpClientPlug\";\nimport { HttpClient } from \"@angular\/common\/http\";\nimport { SweetAlertPlug } from \"..\/adapters\/PresentationAdapter\/SweetAlertPlug\";\nimport { AngularRoutingPlug } from \"..\/adapters\/AngularAdapter\/AngularRoutingPlug\";\nimport { Router } from \"@angular\/router\";\nimport { NgBlockUI, BlockUI } from \"ng-block-ui\";\nimport { TokenManagerPlug } from \"..\/adapters\/TokenManagerAdapter\/TokenManagerPlug\";\nimport { ClipboardPlug } from \"..\/adapters\/DomAdapter\/ClipboardPlug\";\nimport { IHttpClient } from '..\/ports\/IHttpClient';\nimport { ICanNavigate } from '..\/ports\/ICanNavigate';\nimport { ICanManageToken } from '..\/ports\/ICanManageToken';\nimport { ICanCopyToClipboard } from '..\/ports\/ICanCopyToClipboard';\nimport { ICanCheckPermissions } from '..\/ports\/ICanCheckPermissions';\nimport { PermissionsPlug } from '..\/adapters\/PermissionsAdapter\/PermissionsPlug';\nimport { ICanDoHttpRequests } from '..\/ports\/ICanDoHttpRequests';\nimport { HttpRequestPlug } from '..\/adapters\/HttpRequestAdapter\/HttpRequestPlug';\nimport { ICanGiveUserTypes } from '..\/ports\/ICanGiveUserTypes';\nimport { UserTypePlug } from '..\/adapters\/WebApiAdapter\/UserTypePlug';\nimport { NotifierPlug } from '..\/adapters\/PresentationAdapter\/NotifierPlug';\nimport { ICanNotify } from '..\/ports\/ICanNotify';\nimport { ICanGiveApiInfo } from '..\/ports\/ICanGiveApiInfo';\nimport { ApiInfoPlug } from '..\/adapters\/WebApiAdapter\/ApiInfoPlug';\nimport { ICanShowAlert } from '..\/ports\/ICanShowAlert';\nimport { ICanShowDialog } from '..\/ports\/IDialogAdapter';\nimport { DialogPlug } from '..\/adapters\/PresentationAdapter\/DialogPlug';\nimport { ICanTranslate } from '..\/ports\/ICanTranslate';\nimport { TranslationPlug } from '..\/adapters\/TranslationAdapter\/TranslationPlug';\nimport { ICanCRUDStorage } from '..\/ports\/ICanCRUDStorage';\nimport { LocalStoragePlug } from '..\/adapters\/LocalStorageAdapter\/LocalStoragePlug';\nimport { ICanCRUDTransformation } from '..\/ports\/ICanCRUDTransformation';\nimport { TransformationPlug } from '..\/adapters\/WebApiAdapter\/TransformationPlug';\nimport { ICanCRUDUser } from '..\/ports\/ICanCRUDUser';\nimport { UserPlug } from '..\/adapters\/WebApiAdapter\/UserPlug';\nimport { ICanGetCurrentUser } from '..\/ports\/ICanGetCurrentUser';\nimport { CurrentUserPlug } from '..\/adapters\/WebApiAdapter\/CurrentUserPlug';\nimport { ICanBlockUI } from '..\/ports\/ICanBlockUI';\nimport { NgBlockUiPlug } from '..\/adapters\/PresentationAdapter\/NgBlockUiPlug';\nimport { ICanTransceiveEvents } from '..\/ports\/ICanTransceiveEvents';\nimport { EventPlug } from '..\/adapters\/EventAdapter\/EventPlug';\nimport { ICanChangePasswords } from '..\/ports\/ICanChangePasswords';\nimport { ChangePasswordPlug } from '..\/adapters\/WebApiAdapter\/ChangePasswordPlug';\nimport { ICanGeneratePassword } from '..\/ports\/ICanGeneratePassword';\nimport { GeneratePasswordPlug } from '..\/adapters\/WebApiAdapter\/GeneratePasswordPlug';\n\n\n@Injectable()\nexport class Wiring {\n    @BlockUI() blockUI: NgBlockUI;\n\n        getBaseUrl() {\n        let baseUrl = \"http:\/\/localhost:9125\";\n        if ((window as any).config) {\n            baseUrl = (window as any).config.WebApiUrl || \"http:\/\/localhost:9125\";\n        }\n        return baseUrl;\n    }\n\n    constructor(httpClient: HttpClient, componentFactoryResolver: ComponentFactoryResolver, router: Router) {\n\n        let blockUI = this.blockUI;\n\n        const portResolver = new PortResolver();\n\n        portResolver.registerInstance&lt;IHttpClient>('IHttpClient', () => new AngularHttpClientPlug(httpClient));\n        portResolver.registerInstance&lt;ICanNavigate>('ICanNavigate', () => new AngularRoutingPlug(router));\n        portResolver.registerInstance&lt;ICanManageToken>('ICanManageToken', () => new TokenManagerPlug(this.getBaseUrl() + \"\/token\"));\n        portResolver.registerInstance&lt;ICanCopyToClipboard>('ICanCopyToClipboard', () => new ClipboardPlug());\n\n        portResolver.registerInstance&lt;ICanCheckPermissions>('ICanCheckPermissions', () => new PermissionsPlug());\n        portResolver.register&lt;ICanDoHttpRequests>('ICanDoHttpRequests', () => new HttpRequestPlug(this.getBaseUrl()));\n        portResolver.register&lt;ICanGiveUserTypes>('ICanGiveUserTypes', () => new UserTypePlug());\n        portResolver.register&lt;ICanNotify>('ICanNotify', () => new NotifierPlug());\n        portResolver.register&lt;ICanGiveApiInfo>('ICanGiveApiInfo', () => new ApiInfoPlug());\n        portResolver.register&lt;ICanShowAlert>('ICanShowAlert', () => new SweetAlertPlug());\n        portResolver.register&lt;ICanShowDialog>('ICanShowDialog', () => new DialogPlug(componentFactoryResolver));\n        portResolver.registerInstance&lt;ICanTranslate>('ICanTranslate', () => new TranslationPlug());\n        portResolver.register&lt;ICanCRUDStorage>('ICanCRUDStorage', () => new LocalStoragePlug());\n        portResolver.register&lt;ICanCRUDUser>('ICanCRUDUser', () => new UserPlug());\n        portResolver.register&lt;ICanCRUDTransformation>('ICanCRUDTransformation', () => new TransformationPlug());\n        portResolver.registerInstance&lt;ICanGetCurrentUser>('ICanGetCurrentUser', () => new CurrentUserPlug());\n        portResolver.register&lt;ICanBlockUI>('ICanBlockUI', () => new NgBlockUiPlug(blockUI));\n        portResolver.register&lt;ICanTransceiveEvents>('ICanTransceiveEvents', () => new EventPlug());\n        portResolver.registerInstance&lt;ICanChangePasswords>('ICanChangePasswords', () => new ChangePasswordPlug());\n        portResolver.register&lt;ICanGeneratePassword>('ICanGeneratePassword', () => new GeneratePasswordPlug());\n\n        appDomain.setPortResolver(portResolver);\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-1100","post","type-post","status-publish","format-standard","hentry","category-programming"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/1100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=1100"}],"version-history":[{"count":6,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/1100\/revisions"}],"predecessor-version":[{"id":2476,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/1100\/revisions\/2476"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=1100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=1100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=1100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}