Zenith-rammeverket
Zenith er vårt egenutviklede rammeverk, som danner grunnlaget for systemene vi utvikler. Det ble opprinnelig utviklet i forbindelse med versjon 2 av
Emberly for å muliggjøre sanntidssamarbeid mellom flere brukere på samme kart. Etter grundig finsliping har Zenith blitt brukt til å utvikle
Assist, og det blir nå også benyttet til vår neste generasjons AI-plattform "Epsilon".
Ved å benytte Zenith kan vi raskt utvikle kraftige webapplikasjoner som Emberly og Assist. Rammeverket gir automatisk støtte for sanntidssamarbeid, B2B-organisasjonshåndtering, og sikker autentisering. Dette gjør at vi kan levere innovative og robuste løsninger på rekordtid.
Zenith muliggjør også raskt oppsett av databaser og effektiv håndtering av data. Dette gjør at vi kan komme raskt i gang med den faktiske utviklingen av systemet ditt uten å bruke unødvendig tid på standard funksjonalitet. Ved å automatisere disse oppgavene, kan vi fokusere på å skape innovative løsninger og levere et produkt av høy kvalitet på kort tid.
Her ser du sanntids-funksjonaliteten i bruk i Assist-systemet
La meg vise deg et eksempel på hvor raskt vi kan sette opp en ny datamodell ved hjelp av Zenith. Vi kan opprette en modell for for eksempel "PipelineNodeModel" som vil automatisk synkronisere seg mellom alle klientene i organisasjonen.
Vi oppretter først en klasse i backend tjenesten som definerer hvilke felter modellen skal inneholde.
public class PipelineNodeModel : IZenithEntity
{
public string Name { get; set; }
public Vector2D Position { get; set; }
public string Type { get; set; }
public string PipelineId { get; set; }
[BsonId]
public string Id { get; set; }
public string OrganizationId { get; set; }
public IZenithEntity Init()
{
return new PipelineNodeModel
{
Id = Id,
OrganizationId = OrganizationId,
PipelineId = PipelineId,
Name = Name,
Position = Position,
Type = Type,
};
}
}
Denne definisjonen kan vi inkludere under oppstartsfasen av tjenesten. Nedenfor finner du et eksempel på en fullstendig konfigurasjon for Zenith-rammeverket. Denne prosedyren tar seg automatisk av etableringen av alt som er nødvendig. Vi vil også implementere en klasse som endrer standardatferden til en Zenith-modell. I dette spesifikke tilfellet, en modell som muliggjør utsending av push-varsler.
builder.Services
.AddEntityApp(
new EntityAppConfiguration
{
Authority = "<domain>",
Audience = "<audience>",
Namespace = serviceNamespace,
BackplaneConnectionString = builder.Configuration["SignalROptions:RedisBackplaneConnectionString"],
DatabaseConnectionString = builder.Configuration["MongoDbOptions:ConnectionString"],
DatabaseName = builder.Configuration["MongoDbOptions:DatabaseName"]
},
collection => collection
.Add(connectedServices.PushNotifications)
.Add<PipelineNodeModel>("PipelineNode")
)
Modellen er nå klar til å brukes av klienten. For eksempel, vi kan liste opp entiteter ved å bruke React-hooken 'useEntities'. Denne støtter avanserte parametre for filtrering og paginering.
const {
entities, // liste med entitene som matcher filteret vårt
loading // boolean verdi
} = useEntities(
"PipelineNode",
{
and: [ // filteret kan inneholde nøstede logiske strukturer
{
path: "type",
value: "BranchNode",
comparer: Compare.EQ
},
{
path: "pipelineId",
value: "testPipeline1",
comparer: Compare.EQ
}
]
}
);
Alle entitetene du får tilbake oppdaterer seg automatisk hvis de blir endret av andre med tilgang til de, eller andre steder i applikasjonen. Alt av filtrering fungerer med komplekse objekter, lister og de fleste datatyper og enums.
Vi har også liknende metoder for å kjøre fritekst søk med bruk av lucene søkeindekser, da med hooken useSearch.
Hvis ønskelig kan man også skrive mer normale spørringer som tekst, det blir da kompilert automatisk av zenith til strukturen spesifisert over før kjøring.
... = useEntities("PipelineNode", `type == "BranchNode" and pipelineId == "testPipelineId"`)
For å oppdatere data i entitetene har vi hooks som automatisk mapper seg inn mot standard komponenter som tekstfelt hvis man står i kontekst av en entitet.
// pathname til verdien
// kan også representere komplekse objekter med nøsting, og data i lister
const name = useEntityField("name", Defaults.String);
<TextField
value={name.value}
onChange={name.onChange}
/>
Når en bruker benytter seg av tekstfeltet som er definert over, blir endringene automatisk synkronisert i sanntid mellom alle klientene som ser på feltet.
Zenith rammeverket optimaliserer spørringer automatisk, og det vil aggregere flere lignende spørringer. Dette bidrar til å skåne backend-tjenesten og databasen fra unødvendig belastning.
Hvis du har en idé til et nytt system som vi kan utvikle sammen, vil vi entusiastisk anbefale at vi skaper det med basis i Zenith-rammeverket. Ved å gjøre dette, vil vi kunne raskt komme i gang med utviklingen. Videre, vil vi sikre at systemet vil inneholde funksjonalitet som overgår det mange andre systemer bare kan forestille seg. Din innovative idé, kombinert med vår bruk av Zenith, kan utrette utrolige ting. La oss transformere dine ideer til virkelighet sammen.