আমি যোগদানের আগে এবং ব্যবহারকারী এবং পরিবেশের তথ্যের জন্য স্থানীয় স্টোরেজ ব্যবহার করে এমন একটি সমাধান করার আগে কয়েক বছর আগে আমাদের এই সমস্যা হয়েছিল। কৌণিক 1.0 দিন সঠিক। আমরা আগে গতিশীলভাবে রানটাইমে একটি জেএস ফাইল তৈরি করেছিলাম যা তখন তৈরি হওয়া এপিআই ইউআরএলকে একটি বৈশ্বিক চলক হিসাবে স্থাপন করবে। আমরা এই দিনগুলিতে আরও কিছু OOP চালিত এবং কোনও কিছুর জন্য স্থানীয় সঞ্চয়স্থান ব্যবহার করি না।
পরিবেশ এবং এপিআই ইউআরএল নির্মাণ উভয়ের জন্য আমি আরও ভাল সমাধান তৈরি করেছি।
এটি কীভাবে আলাদা?
কনফিগারেশন.জসন ফাইল লোড না হওয়া পর্যন্ত অ্যাপটি লোড হবে না। এটি এসওসি-র একটি উচ্চতর ডিগ্রি তৈরি করতে কারখানার ফাংশন ব্যবহার করে। আমি এটিকে কোনও পরিষেবাতে আবদ্ধ করতে পারি, তবে আমি কখনই কোনও কারণ দেখিনি যখন ফাইলটির বিভিন্ন বিভাগের মধ্যে একমাত্র মিলটি হ'ল তারা ফাইলটিতে একত্রে উপস্থিত থাকে। কারখানার ক্রিয়াকলাপটি আমাকে ফাংশনটি গ্রহণ করতে সক্ষম হলে সরাসরি মডিউলটিতে ফাংশনটি পাস করার অনুমতি দেয়। সবশেষে, যখন ফ্যাক্টরি ফাংশনগুলি ব্যবহারের জন্য উপলব্ধ থাকে তখন আমার ইনজেকশন টোকেন সেটআপ করার সহজ সময় হয়।
ডাউনসাইডস?
আপনি যে কনফিগার করতে চান যে মডিউলটি কোনও কারখানার ফাংশনটি রূট () বা ফরচিল্ড () এর মধ্যে প্রবেশ করতে দেয় না, এবং অন্য কোনও উপায় নেই, আপনি এই সেটআপটি (এবং অন্যান্য উত্তরগুলির বেশিরভাগ) ব্যবহার করে ভাগ্যের বাইরে চলে যান to একটি কারখানা ফাংশন ব্যবহার করে প্যাকেজটি কনফিগার করুন।
নির্দেশনা
- কোনও জসন ফাইল পুনরুদ্ধার করতে আনতে ব্যবহার করে, আমি উইন্ডোটিতে বস্তুটি সঞ্চয় করি এবং একটি কাস্টম ইভেন্ট উত্থাপন করি। - হোয়াইটএইচজি-ফেচ ইনস্টল করতে এবং আইই সামঞ্জস্যের জন্য এটি আপনার পলিফিল.সেটগুলিতে যুক্ত করতে মনে রাখবেন
- কাস্টম ইভেন্টের জন্য ইভেন্ট শ্রোতার শ্রবণ করুন।
- ইভেন্ট শ্রোতা ইভেন্টটি গ্রহণ করে, একটি পর্যবেক্ষণযোগ্যের কাছে উইন্ডো থেকে বস্তুটি পুনরুদ্ধার করে এবং উইন্ডোতে কী সঞ্চিত ছিল তা পরিষ্কার করে দেয়।
- বুটস্ট্র্যাপ কৌণিক
- এখানেই আমার সমাধানটি সত্যিই আলাদা হতে শুরু করে -
- একটি ইন্টারফেস রফতানি করে এমন একটি ফাইল তৈরি করুন যার কাঠামোটি আপনার কনফিগারেশনকে উপস্থাপন করে - এটি সত্যিকারের ধরণের ধারাবাহিকতায় সহায়তা করে এবং কোডের পরবর্তী বিভাগের জন্য একটি প্রকারের প্রয়োজন হয়, এবং নির্দিষ্ট করে না
{}
বা any
যখন আপনি জানেন যে আপনি আরও কিছু নির্দিষ্ট করতে পারেন
- এমন আচরণ আচরণটি তৈরি করুন যা আপনি পার্সড জেসন ফাইলটি ৩ য় ধাপে পাস করবেন।
- এসওসি বজায় রাখতে আপনার কনফিগারেশনের বিভিন্ন বিভাগের রেফারেন্স করতে কারখানার ফাংশন ব্যবহার করুন
- আপনার কারখানার কার্যকারিতার ফলাফলের প্রয়োজন এমন সরবরাহকারীদের জন্য ইনজেকশনটোকেনস তৈরি করুন
- এবং / বা -
- কারখানার ফাংশনগুলি সরাসরি তার ফর রুট () বা ফরচিল্ড () পদ্ধতিতে কোনও ফাংশন গ্রহণ করতে সক্ষম মডিউলগুলিতে পাস করুন।
- main.ts
আমি উইন্ডো ["পরিবেশ"] চেক করে একটি ইভেন্ট শ্রোতা তৈরির আগে এমন সমাধানের সম্ভাব্যতাটিকে মঞ্জুরি দেয় না যেখানে উইন্ডো ["এনভায়রনমেন্ট"] মেইন.এস.টিতে কোড কার্যকর করার আগে অন্য কোনও উপায়ে পপুলেট করে।
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { configurationSubject } from './app/utils/environment-resolver';
var configurationLoadedEvent = document.createEvent('Event');
configurationLoadedEvent.initEvent('config-set', true, true);
fetch("../../assets/config.json")
.then(result => { return result.json(); })
.then(data => {
window["environment"] = data;
document.dispatchEvent(configurationLoadedEvent);
}, error => window.location.reload());
if(!window["environment"]) {
document.addEventListener('config-set', function(e){
if (window["environment"].production) {
enableProdMode();
}
configurationSubject.next(window["environment"]);
window["environment"] = undefined;
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.log(err));
});
}
--- পরিবেশ-সমাধানকারী
অপ্রয়োজনীয়তার জন্য আমি উইন্ডো ["পরিবেশ"] ব্যবহার করে আচরণবিধিটিকে একটি মান নির্ধারণ করি। আপনি এমন একটি সমাধান প্রস্তুত করতে পারেন যেখানে আপনার কনফিগারেশনটি ইতিমধ্যে প্রিললোড হয়েছে এবং উইন্ডো ["এনভায়রনমেন্ট"] ইতিমধ্যে মুখ্য. কোডগুলির কোড সহ আপনার অ্যাংুলারের অ্যাপ্লিকেশন কোড চালুর সময় ইতিমধ্যে পপুলেটে গেছে
import { BehaviorSubject } from "rxjs";
import { IConfig } from "../config.interface";
const config = <IConfig>Object.assign({}, window["environment"]);
export const configurationSubject = new BehaviorSubject<IConfig>(config);
export function resolveEnvironment() {
const env = configurationSubject.getValue().environment;
let resolvedEnvironment = "";
switch (env) {
}
return resolvedEnvironment;
}
export function resolveNgxLoggerConfig() {
return configurationSubject.getValue().logging;
}
- app.module.ts - সহজ বোঝার জন্য ছিটানো
মজার ব্যাপার! NGXLogger এর পুরানো সংস্করণগুলির জন্য আপনাকে লগগারমডিউল.ফরট () এর মধ্যে কোনও বস্তুতে পাস করতে হবে। আসলে লগারমডুল এখনও করে! এনজিএক্সলগার দয়া করে লগারকনফাইগকে প্রকাশ করে যা আপনি সেটআপের জন্য একটি ফ্যাক্টরি ফাংশন ব্যবহার করার অনুমতি দিয়ে ওভাররাইড করতে পারেন।
import { resolveEnvironment, resolveNgxLoggerConfig, resolveSomethingElse } from './environment-resolvers';
import { LoggerConfig } from 'ngx-logger';
@NgModule({
modules: [
SomeModule.forRoot(resolveSomethingElse)
],
providers:[
{
provide: ENVIRONMENT,
useFactory: resolveEnvironment
},
{
provide: LoggerConfig,
useFactory: resolveNgxLoggerConfig
}
]
})
export class AppModule
সংযোজন
আমি কীভাবে আমার এপিআই url তৈরির সমাধান করেছি?
আমি প্রতিটি ইউআরএল একটি মন্তব্যের মাধ্যমে কী করেছে তা বুঝতে সক্ষম হতে চেয়েছিলাম এবং জাভাস্ক্রিপ্টের (আইএমও) তুলনায় টাইপস্ক্রিপ্টের সবচেয়ে বড় শক্তি যেহেতু টাইপচেকিং চেয়েছিল। আমি অন্যান্য ডেভসদের জন্য নতুন এন্ডপয়েন্টগুলি যুক্ত করতে একটি অভিজ্ঞতা তৈরি করতে চেয়েছিলাম, এবং এপিএস যেটি যতটা সম্ভব নির্বিঘ্ন ছিল।
আমি একটি ক্লাস তৈরি করেছি যা পরিবেশ (ডিভ, টেস্ট, স্টেজ, প্রোড, "" এবং ইত্যাদি) নেবে এবং এই মানটি একাধিক ক্লাসে পাস করেছে [1-N] যার কাজ প্রতিটি API সংকলনের জন্য বেস url তৈরি করা create । প্রতিটি এপিআইক্লিকেশন এপিআইয়ের প্রতিটি সংগ্রহের জন্য বেস url তৈরির জন্য দায়বদ্ধ responsible আমাদের নিজস্ব এপিআই, বিক্রেতার এপিআই বা একটি বাহ্যিক লিঙ্ক হতে পারে। এই শ্রেণিটি এটির প্রতিটি পরবর্তী এপিতে তৈরি বেস url পাস করবে। খালি হাড়ের উদাহরণ দেখতে নীচের কোডটি পড়ুন। একবার সেটআপ হয়ে গেলে, অন্য দেবের পক্ষে এপি ক্লাসে অন্য কোনও স্পর্শ না করেই অন্য একটি শেষ পয়েন্ট যুক্ত করা খুব সহজ।
টিএলডিআর; মেমরি অপ্টিমাইজেশনের জন্য বেসিক ওওপি নীতিগুলি এবং অলস গেটর
@Injectable({
providedIn: 'root'
})
export class ApiConfig {
public apis: Apis;
constructor(@Inject(ENVIRONMENT) private environment: string) {
this.apis = new Apis(environment);
}
}
export class Apis {
readonly microservices: MicroserviceApiCollection;
constructor(environment: string) {
this.microservices = new MicroserviceApiCollection(environment);
}
}
export abstract class ApiCollection {
protected domain: any;
constructor(environment: string) {
const domain = this.resolveDomain(environment);
Object.defineProperty(ApiCollection.prototype, 'domain', {
get() {
Object.defineProperty(this, 'domain', { value: domain });
return this.domain;
},
configurable: true
});
}
}
export class MicroserviceApiCollection extends ApiCollection {
public member: MemberApi;
constructor(environment) {
super(environment);
this.member = new MemberApi(this.domain);
}
resolveDomain(environment: string): string {
return `https://subdomain${environment}.actualdomain.com/`;
}
}
export class Api {
readonly base: any;
constructor(baseUrl: string) {
Object.defineProperty(this, 'base', {
get() {
Object.defineProperty(this, 'base',
{ value: baseUrl, configurable: true});
return this.base;
},
enumerable: false,
configurable: true
});
}
attachProperty(name: string, value: any, enumerable?: boolean) {
Object.defineProperty(this, name,
{ value, writable: false, configurable: true, enumerable: enumerable || true });
}
}
export class MemberApi extends Api {
get MemberInfo() {
this.attachProperty("MemberInfo", `${this.base}basic-info`);
return this.MemberInfo;
}
constructor(baseUrl: string) {
super(baseUrl + "member/api/");
}
}