Avatar billede _basil Nybegynder
14. november 2003 - 13:56 Der er 18 kommentarer og
1 løsning

3 projects i en solution.

Hej eksperter..

Jeg har en solution med 3 projects i. Et project der indeholder en windowsform altså en windowsapplikation. Så er der et projekt der indeholder et klassebibliotek. I denne er der en klasse:
using System;

namespace Position
{
    public class Koordinat
    {
        private static string koor;

        public Koordinat()
        {
            koor = "000,000";
        }

        public static void setPos(string s)
        {
            koor = s;
        }

        public static string getPos()
        {
            return koor;
        }
    }   
}

Det 3. project er en webservice der skal kalde getPos i ovenstående klasse.

Ideen er at noget i windowsformen opdaterer koordinatklassen en gang i sekundet og når webservidcen bliver kaldt skal den retunere det nuværende koordinat..
Men så skal webservicen og windowsformen jo snakke med samme koordinat-"object"?? og det gør den ikke?
Avatar billede bennytordrup Nybegynder
14. november 2003 - 13:59 #1
prøv at lave en

private Koordinan _koor

Din constructor skal være protected

du skal have en

public static Koordinat KoordinatInstance
{
  if (_koor == null)
    _koor = new Koordinat();
  return _koor;
}
Avatar billede bennytordrup Nybegynder
14. november 2003 - 14:01 #2
Ideen er, at der kun kan oprettes en instance af klassen. Dette styres ved at have protected constructor.

Derudover er der den statiske metode, som returnerer selve den instance, der skal bruges. Den tester selv på, om den lokale instance er oprettet.
Avatar billede finger Nybegynder
14. november 2003 - 14:19 #3
Hvis du aldrig erklærer en ny instans af din klasse (Koordinat k = new Koordinat();) og du i din parametre til meotden altid overfører den instans af klassen, så burde det være den samme instans du jonglerer med.

Det som Benny har lavet kaldes en Singletonklasse. Den sikrer at der i dit program altid kun er een instans af klassen.
Men da du både kører eet program på IIS og et på din klient vil der være 2 instanser. (desuden er benny's forslag heller ikke tråd sikker)

Hvis du vil være sikker på at det er den samme instans du jonglerer med, bør du kun instantiere een gang ENTEN på din klient ELLER på din server og så giver klassen med i kald.
Hvis du alligevel vil bruge singleton, så gør den trådsikker:

---------------------
private Koordinan _koor
private static object m_padlock = new object();

Din constructor skal være private

du skal have en

public static Koordinat KoordinatInstance
{
  lock(padlock)
  {
    if (_koor == null)
        _koor = new Koordinat();
  }
  return _koor;
}
------------------

hent en instans af klassen gåledes:

Koordinat = Koordinat.KoordinatInstance();
Avatar billede _basil Nybegynder
14. november 2003 - 14:19 #4
er det det der heddder et singleton mønster?  jeg tror ikke jeg er helt med .. Hvordan skulle klassen så se ud?
Avatar billede bennytordrup Nybegynder
14. november 2003 - 14:21 #5
finger >> Indrømmet, jeg har ikke tænkt på thread.

Men skal du ikke have en unlock, eller har jeg misforstået noget?
Avatar billede _basil Nybegynder
14. november 2003 - 14:39 #6
tror jeg er lidt forvirret... hvordan ville den rigtige/optimale måde være at løse dette på?
Avatar billede finger Nybegynder
14. november 2003 - 14:48 #7
benny--> nej, man behøver ikke unlock. Når man kommer ud af lock området, låses der automatisk op igen.

_basil--> jeg vil mene at det bedste vil være at have styr på hvornår du laver en ny instans af din klasse og hvornår du laver en reference.
Avatar billede _basil Nybegynder
14. november 2003 - 14:52 #8
Jo men hvis jeg opretter instancen i fx windowsform, kan jeg jo ikke tilgå den fra webserviceklassen.. Jeg kan jo ikke ekspotere den som dll og dermed referere til den fra webservicen?
Avatar billede finger Nybegynder
14. november 2003 - 14:55 #9
Hvis du har din klasse i samme solution som både winformen og webservicen og har lavet en reference til projektet med klasserne fra dem begge, så er der da ingen problemer i det.
Avatar billede _basil Nybegynder
14. november 2003 - 15:05 #10
Jeg tror sgu jeg har en hæklefejl i kysen :) Altså nu har jeg gjort følgende i min winform:
lavet en private klassevaribel og jeg instaniecerer også objektet her..
Jeg har lavet en metode der retunerer denne private variabel:
public Koordinat sendKo()
        {
            return ko;
        }
(og nej ikke MUUUUUHHHH!!)
Nu står jeg så i min webservice klasse og vil gerne tilgå denne metode så jeg får den rigtige reference? Men jeg kan jo ikke skrive Form1.sendKo();

Hvad er det lige jeg ikke forstår?
Avatar billede finger Nybegynder
14. november 2003 - 15:21 #11
ææææhhh... nej det kan ikke lade sig gøre!
Webservicen og winformen er jo 2 selvtændige programmer.

Jeg var under den opfattelse af at du har en klasse koordinat med din info i som du vil sende frem og tilbage mellem webservice og winform...

Så skal du jo kalde en metode på webservicen der kan modtage din klasse, gøre noget ved din klasse og returnere den igen.

Er det det du vil?
Avatar billede _basil Nybegynder
14. november 2003 - 15:28 #12
Altså for at forklare hvad ideen er: Programmet skal bruges til at "fake" positionering.. Jeg har i min winform en flashklient med et kort hvor jeg kan flytte en lille rød prik rundt. Denne prik giver en koordinatstring fra sig som jeg fx kan skrive i en tekstboks.. Min ide er nu at lave en webservice der kan hente denne værdien af denne string..

Ideen er så at denne webservice bliver kaldt en gang i sekundet på en klient, der dermed opdaterer prikkens position alt efter hvor jeg flytter den hen i min winform...
Avatar billede _basil Nybegynder
14. november 2003 - 15:29 #13
problemet er vel at jeg ikke kan lave både en webform og webservice i samme project.. Så kan det her overhovedet lade sige gøre?
Avatar billede finger Nybegynder
14. november 2003 - 15:31 #14
webservicen kan som sådan ikke hente den. det må være formen der skal sende data'en til webservicen. så kan webservicen evt returnere noget.
Hvis du vil lave det så "webservicen" skal hente data fra formen så skal du nok bruge en direkte socket forbindelse, men så hedder edt ikke webservice længere.
Avatar billede finger Nybegynder
14. november 2003 - 15:32 #15
du kan ikke lave det i samme project, men godt som flere projects i samme solution.
Avatar billede _basil Nybegynder
14. november 2003 - 15:34 #16
Men er det ikke netop det jeg har forsøgt??
Avatar billede _basil Nybegynder
14. november 2003 - 15:39 #17
Ville en singleton implementering løse problemet og hvis ja hvordan skal klassen så se ud? Jeg har forsøgt at følge jeres svar uden held..
Avatar billede finger Nybegynder
14. november 2003 - 15:42 #18
du skrev:
----------
Min ide er nu at lave en webservice der kan hente denne værdien af denne string..
---------
og sam sagt kan du ikke kalde din form fra webservicen, men skal kalde webservicen fra formen og overføre data til webservicen.

Singleton vil ikke løse noget her.
Avatar billede _basil Nybegynder
14. november 2003 - 15:44 #19
ok.. jeg takker for hjælpen.. Har løst det ved at lade webservicen styre det hele .. dermed ingen winform, kun en webservice
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester