Struktur og orden i større .NET løsning

Tags:    programmering

<< < 12 > >>
Jeg tror jeg har haft et lignende spørgsmål før angående temperatur kontrol, men det her er langt mere overordnet.

En del af jer ved sikkert at jeg har noget hjemme automatisering kørende i et godt stykke tid. Det virker fint og er alt sammen guld og grønne skove.

Men nu har jeg for nyligt tilføjet en fingeraftrykscanner. Og som sædvanlig er det super let lige at flække en hurtig demo sammen. MEN som altid er det super svært at implementere ind i mit system. Det hele kører i en EXE og kræver lidt knofedt at få nye koncepter ind i.


Så jeg sørger efter lidt svar / sparing med nogle af jer udviklere herinde, som nok har gjort den slags her noget længere tid end jeg selv har gjort.

Hvordan styrer man sådanne større projekter?


Jeg kører 2 pc'er, en er en touch screen som har fingeraftrykscanner og magnetisk kortlæser sat til. Det er også der det meste daglige kontrol af værelset nok foregår.

Så har vi mediacentret / hjemmeautomatiseringserveren som har nogle USB/TTL porte (Dvs seralle porte i .NET) som kommunikerer med hardwaren. Jeg har også nogle virtuelle kontrollag som fx kan styre min mobil og min bærbare pc.

Systemet har også (og skal beholde funktionen) et vækkeur. Det vækkeur henter også information ind fra nettet om nuværende tilstand i verden ( :D )... Systemet skulle også gerne integreres med gymnasiets systemer på sigt. Og også gerne muligheder for at få facebook osv ind. Så generelt skal det være åbent for udvidelse uden at ændre alting igen.


Jeg ønsker helst at holde lagene ret separerede så jeg næsten bare kan slette en del eller lave en ny, og den skal være praktisk talt en del af systemet øjeblikkeligt, eller systemet skal bare selv hægte den fra.

Jeg ville også foretrække at holde logikken samlet et sted. Og helst undgå alle kald fra en klasse til en anden. Netop det der med at de ikke må være for afhængige af hinanden, men at jeg i stedet bare har en klump lim eller en "central" der router deres information rundt uden at gøre noget betydningsfuldt.

Jeg ved ikke helt hvor meget I forstod, og om jeg fik specificeret mine tanker klart nok. Men jeg håber at I kan følge mig langt hen af vejen. For jeg er lidt blank.


Jeg har overvejet noget hvor der er en master EXE som så kan loade DLL filer dynamisk ind i nye app domains og så kunne nogle "events" og kommandoer køre rundt mellem dem. Sådan lidt ligesom at de blev broadcastet ud til alle andre plugins. Generelt meget uoverskueligt -.-



16 svar postet i denne tråd vises herunder
5 indlæg har modtaget i alt 31 karma
Sorter efter stemmer Sorter efter dato
Lav et singleton der repræsenterer hver port, alternativt en statisk klasse.



Det har også været min idé indtil nu. Men er det ikke i konflikt med idéen om interfaces/modularitet da de så pludselig er afhængige af et direkte fælles objekt?



Det har også været min idé indtil nu. Men er det ikke i konflikt med idéen om interfaces/modularitet da de så pludselig er afhængige af et direkte fælles objekt?


Tjooeh ja joeh, men du kan godt gøre det, bare som en klasse. Og så acceptere at den ikke er et interface. Alternativt skal du lave det som et interface og så bruge StructureMap eller lignende IOC container til at initialisere den som et singleton. Jeg synes du skal i føste omgang gå på kompromis med det og "bare" lave det som en klasse, det er nemt at ændre senere.

Alternativt skal du lave endnu et lag, således du indkapsler dine porte i et data lag. Dvs. laver IDataLayer interfaces og sender sådan et med ind til hver IAutomationItem, så kan de kalde deres metoder på den. Det er i virkeligheden måske bedre. Det fjerner ikke helt ønsket om singleton, men gør det måske nemmere at strukturere.



Hej Henrik,

Jeg har i længere tid fulgt med i dit hjemmeautomatiserings-projekt, da jeg selv er i gang med noget lignende, men mangler hardware resourcerne.

Faktisk har jeg hele min infrastruktur implementeret, mangler bare noget den rent faktisk kan lege med. Til de projekt har jeg også udviklet et scraper/API til Lectio (hvilket jeg formoder dit gymnasium bruger). Du skriver at du gerne vil lege med at få dit vækkeur til at fungere vha. gymnasiets skema, og mit API tillader dig netop det (og mere).

Hvis du er interesseret i koden (ganske vidst skrevet i Node.js, men det kan du vel oversætte eller bruge eksternt), så skriv og så skal jeg sende det til dig.

Ang. min egen infrastruktur er Node.js som formodentligt bekendt, skrevet i JavaScript, et typesvagt og efter min mening langt mere dynamisk sprog. Derfor har det været en leg at implementere hele serveren med en modular-tilgang.
Serveren kører en kommunikationsprotokol over HTTP(S), TCP og Seriel porte, hvor en klient kan kalde en bestemet service, og tilgå dens actions. En service implementere altså en masse actions, som en klient kan agere med.
Et eksempel kunne være en Lampe Service:
Fold kodeboks ind/udKode 


Min services er ikke skrevet så abstrakt, og er skrevet i JavaScript modules, men you get the idea. En sådan service kunne altså tilgåes vha. fx. HTTPS, ved at POST'e til URL'en:
https://[serverurl]/api/Lamp/on

Håber det kan hjælpe dig i dit forehavende. Jeg vil i hvert fald foreslå en modulær tilgang til "plugins" som du kalder dem, hvis det overhovedet er muligt i .NET.

Held og lykke.



Indlæg senest redigeret d. 18.09.2011 14:33 af Bruger #11328
Saebekassebil



Jotak. Ville da være interesseret i at se det men af en eller anden grund (og til stor frustration for samtlige elever på gymnasiet) har man valg Fronter og CSC LUDUS (to forskellige systemer) til aflevering og skemaer.
Men jeg har skam også skrevet mit eget API til deres system så det er helt fint :)



Jeg har fint nok styr på kodningen af individuelle elementer, der hvor jeg virkelig fejler er med viden omkring større systemer. Altså fx forsøger jeg at lære mig nogle design principper og forsøger at arbejde efter dem i mindre skala.

Det med plugins lader sig let gøre gennem reflection.

Hvis du skal bruge hjælp med hardwaren kan du o øvrigt bare fange mig herinde ;).





Brian...
Jeg ovejer lidt at gå for idéen med flere lag. Ellers skal jeg som sagt have sådan en static class hængene med forbindelserne i.
Jeg havde egentlig tænkt mig at kode løs her i weekenden (får ikke tid næste weekend, og heller ikke næste igen)... Så jeg ville egentlig gerne få det gjort.


Men så er der jo ordsproget "hastværk er lastværk" eller hvad man nu siger. Så tror bare at jeg vil kigge lidt ind i hvordan pokker jeg får lagt det her bedst ud. For jeg er træt af at lave tingene om. Og jeg vil helst bare have et stabilt luksuriøst system, så jeg kan fokusere på at få scoret nogle af alle HF'erne, og helst uden at de griner af mig når værelsets lys ikke vil tænde fredag aften (det var så et sidespor ;)).



















- UPDATE -


I må undskylde for at rode op i denne her tråd igen, men jeg følte at et tak var på sin plads... Jeg har læst godt op omkring interfaces og jeg føler selv at jeg så småt er ved at komme ind i vanen allerede.

Nu skriver jeg altid mit Interface først og så implementerer jeg det bagefter. Alle mine objekt variabler defineres som et givent interface og så referer de til min implementering af det interface.

Jeg kan godt se pointen i det her nu, det gør koden langt mere overskuelig at se på. Jeg er i øvrigt også begyndt at flytte nogle af mine ting ud i DLL filer, simpelthen fordi at de aldrig rigtig vil ændre sig igen og derfor tænkte jeg "Nåh ja, på denne her måde får jeg da ikke ødelagt noget ved et uheld".






Mit næste større dilemma bliver hvordan jeg skal kode TCP Serveren. Indtil nu har den kørt en tekstbaseret protokol hvor serveren parser beskederne ved brug af nogle regexes. Systemet er skam ganske robust men jeg føler ikke at det er optimalt (tænker ikke så meget performance mæssigt, så meget trafik er der ikke).

Jeg har tænkt lidt på at serialize et "Packet objekt" ind i streamen og så kunne det objekt have en Payload og så nogle properties der fortæller om det er krypteret og evt hvad type packet det er (Kommando, Information, Databaseforespørgsel etc.)


Lyder det helt hen i vejret? :S



Apropos databaser. Jeg har haft lidt af hvert indtil videre. Startede med tekstfiler, så gik det videre til nogle XML agtige filer (ja det er stadig tekstfiler, men det var fremskridt), så kom jeg til Microsoft Access Databaser, og nu kører jeg Microsoft SQL CE.

Før i laver grin med mig og mine tekstfiler så var det mens programmet var i tidlig prototype og jeg slet ikke havde den vildeste idé om hvad det her ville ende i.

Jeg er egentlig godt tilfreds med SQL CE. For jeg kan let kopiere databasen frem og tilbage, og hastigheden er skam helt fin for projektet her. MEN man kan kun have en forbindelse til hver database af gangen, og det er noget af et drawback.

Jeg har overvejet at sætte en MySQL eller MSSQL server op i stedet. Grunden til jeg overvejer MySQL er at jeg faktisk har erfaring med at kode .NET løsninger mod MySQL hvor i mod jeg faktisk aldrig har anvendt MSSQL :$.

Jeg får brug for en måde at lade andre computere tilgå databasen (i begrænset omfang), fx touchskærmen er nød til at kunne hente fingeraftryk ud til matching, og det skal gøres lokalt på touchskærmen hvor scanneren er sat til, grundet det SDK jeg anvender ikke virker på Windows 7.

Jeg tænkte på at sætte en database server op på hovedserveren der kører systemet og så havde en bruger med kun læse adgang til fingeraftrykkende og så tillade fjernforbindelser. Så kunne touchskærmen kommunikere direkte med databasen. Alternativet er at have en server lokalt (SQL Ce, MSSQL, MySQL?) og så selv skrive et interface hvor i gennem, at touchskærmen og andet software kunne forespørge den slags information. Dette ville selvfølgelig tillade størst kontrol, men jeg er bekymret rent performancemæssigt. Min nuværende server implementing er jo som nævnt tidligere tekstbaseret og med faste buffergrænser. Hvis jeg skal querie for 30+ fingeraftryk (Flere aftryk af hver finger for øget matching chance og flere forskellige personer, med flere forskellige fingre) og hver template er på omkring 200 - 300 kb, så tør jeg næsten ikke skrive det selv når det skal gå rigtig stærkt. Jeg er godt nok på 100mbit LAN men alligevel, så mærkes millisekunderne altså når man står foran døren og vil ind :D.


Jeg har bare aldrig haft en blotlagt server før så jeg ved ikke om det er sikkert? Det er kun over for det lokale netværk, men jeg skriver hele systemet med sikkerhed for øje (for sjov skyld, men lige så meget for hvis jeg endda bliver uvenner med nogle andre nørder).

Sidste alternativ er at have en lokal database på touchskærmen som er synkroniseret med den pc hjemmeserveren, men jeg synes bare det er så "skrøbelig" og uprofessionel en løsning.



Ps. Når du har læst ovenstående bunke tekst, så undskylder jeg for at det blev til 698 ord. :P



Indlæg senest redigeret d. 25.09.2011 16:57 af Bruger #14381
Tak for linket, det ser interessant ud. Men jeg ved nu ikke helt. Kan godt se idéen i det, men har aldrig været en JSON fan. Tror det er bedre at jeg holder mig til de relationelle tanker for nu :D


Vil så spørge... Hvis jeg har en MySQL database kørende på LAN med et stærk root password ("Very strong" ifølge online checkere, er 20 tegn med tal, numre og specialtegn), er det så et problem at tillade "remote access" og "remote root"... Kan altid slå "remote root access" fra igen, men er det sikkert at have remote access?

Ved at mange firmaer kører dedikerede interne MySQL servere som jo så må have den port åben.

Men det bør ikke være noget problem for mig vel? Det er ikke sådan at der findes 350 forskellige orme der kan sprede sig den vej eller lignende?



For det vil helt sikkert være det mest praktiske. For mine PHP applikationer burde sådan set også havde adgang til serveren (min webserver er på samme netværk). De kunne så passende bare få deres eget "read only" login og så var det det.

Touchskærmen ville også bare kunen querie serveren direkte.




Synes I at det er en god idé? Eller skal jeg en anden vej hen?

Jeg prøver i hvert fald lige og ser hvordan det går her til aften. Takket være det med interfaceprogrammering har det jo aldrig været lettere at skifte mit databaselag ud med et andet :D


Kan det evt. hjælpe hvis jeg finder ud af at få sat serveren op så den kun tillader forbindelser fra det lokale subnet?



Indlæg senest redigeret d. 25.09.2011 21:20 af Bruger #14381
<< < 12 > >>
t