public static ;)
Jag skulle nog skapat en factory istället för köra med singelton och låta min factory hantera singelton åt mig. Så varje gång du ska använda din Service så går du mot en factory som get dig instansen till proxy klassen.
16 svar · 645 visningar · startad av saw
Min lilla Web Servise börja att bli riktigt bra nu tack vare er fina hjälp.
Jag har en undran, nu etablera jag mi nWeb Service så här:
private localhost.WebService service = new SAW_Registret.localhost.WebService();
Detta är som ni ser den lokala varianten, men min fundering är, jag har lagt denna i varje formulär jag har (7 st) går det inte att göra detta globalt i stället? :stud
public static ;)
Jag skulle nog skapat en factory istället för köra med singelton och låta min factory hantera singelton åt mig. Så varje gång du ska använda din Service så går du mot en factory som get dig instansen till proxy klassen.
Nu bidde det här rena grekiskan, har du lust att förklara eller något exempel?
saw skrev:
Nu bidde det här rena grekiskan, har du lust att förklara eller något exempel?
En factory kan texc vara en metod som skapar ett objekt åt dig tex:
public ICustomer CreateCustomer()
...
return new Customer();
var customer = CreateCustomer()
Det finns många ramverk så som Unity från Microsoft PAG och Spring.Net som kan användas som factory och skapa objekt åt dig. Du kan via dessa anger om du ska bara ha en instans av ditt objekt och inte ett nytt varje gång du vill skapa ett objekt. Singelton är ett design pattern som används för att se till så vi har bara en instance av ett objekt, och det är det du är ute efter med din Proxy klass, enligt din fråga, eller?
fredrikn det här kan du märker jag, jag surfade omkring för att få lite kött på benen,
men jag måste erkänna att jag förstår ingenting. Det finns inget enklare sätt?
saw skrev:
fredrikn det här kan du märker jag, jag surfade omkring för att få lite kött på benen,
men jag måste erkänna att jag förstår ingenting. Det finns inget enklare sätt?
Jag vill inte ta några ansvar för detta, du får ta det ;) Men här är ett exempel för att göra det mycket enklare för dig:
private static readonly localhost.WebService _service = new SAW_Registret.localhost.WebService();
public static class ServiceFactory
...
public static GetSAW_Registret()
...
return _service;
Nu kommer du bara ha en instans av service.. eftersom vi använder oss av static, om du lägger till readonly så kommer du inte kunna tilldela värde till _service vid senare tillfälle. Lägg denna kod i en klass, sedan anropar du metoden varje gång du vill anropa din Service:
minService = ServiceFactory.GetSAW_Registret();
Jag valde en metod här för att inte exponera variablen _service publikt. Sorry för ful kod, men jag sitter på en MacBook och får inte till måsvingar just nu ;)
Tack men som du förstår så kom jag i kläm med en gång.
public static GetSAW_Registret()
{
return _service;
}
Error: Måste ha en return-type.. inte string eller?
Sen blev jag konfunderad av var jag skall lägga denna koden.
Skall jag ha en ny Class-fil?
Jag la det så här, är det rätt?
public static class ServiceFactory
{
private static readonly localhost.WebService _service = new SAW_Registret.localhost.WebService();
public static GetSAW_Registret()
{
return _service;
}
}
Ja, jag tycker du ska skapa en egen klass för din factory och metodsignaturen bör vara följande:
public static localhost.WebService GetSAW_Registret()
Då är det dax för nästa problem
minService = ServiceFactory.GetSAW_Registret();
//Error:
The name 'minService' does not exist in the current context
Det var väll så jag blev rekommenderad???
Vad jag menar är, om jag gör så här
private localhost.WebService minService = ServiceFactory.GetSAW_Registret();
Då har jag inga error, men då är jag tillbaka till utgångspunkten.
Det jag var intresserad av var om jag bara kunde ändra på ett ställe istället
för 7 när jag går över till skarpt läge.
localhost.WebService minService = ServiceFactory.GetSAW_Registret();
Compusa se mitt editerade innlägg.
Sorry, glömde ange return typ på metoden ;)
Vad menar du att ändra på flera ställen? För om du går mot en factory så är det den som skapar din instans av servicen. Men du kommer ha ett beroende av servicens typ. Detta kan du lösa genom att använda interface istället för en typ.
Jo vad jag tänkte är att om jag har
private localhost.WebService minService = ServiceFactory.GetSAW_Registret();
..i början av varje formulär, vad händer när jag i classen ändrar..
private static readonly localhost.WebService _service = new SAW_Registret.localhost.WebService();
//till
private static readonly minServer.WebService _service = new SAW_Registret.minServer.WebService();
..räcker det att jag ändrar i classen, eller måste det ändras överallt???
(om jag förstod dig rätt så är det så).
Men du kommer ha ett beroende av servicens typ. Detta kan du lösa genom att använda interface istället för en typ.
Hur menar du med det?
Det är du som sätter namespacet som skapas när du lägger till din Web Reference, så varför inte sätt samma namn på din Web Reference till minServer istället för localhost? För du vet väl om att du kan i fönstret där du lägger till din reference, har en textbox där du anger namnet på din Web Reference? :P
Om du har en typ tex Customer, så är du bunden till den typen om du skriver:
Customer customer = CustomerFactory.CreateCustomer();
men om du använder dig av ett interface som Customer implementerar, tex ICustomer så kan du skriva:
ICustomer customer = CustomerFactory.CreateCustomer();
Då kan din CreateCustomer returnera vad som, bara de objekten implementerar interfacet ICustomer.
Ok, då skall jag försöka, än en gång ett strort tack till dig Compusa.
Naturligtvis så springer jag in i vägen..
public static class ServiceFactory
{
private static readonly minService _service = new SAW_Registret.minService();
public static minService GetSAW_Registret()
{
return _service;
}
}
.. och för felet
'SAW_Registret.minService' is a 'namespace' but is used like a 'type'
Jag hittar ingen som helst hjälp på nätet, vad tror ni?
Efter mycket om och men så tror jag att jag har lyckats
public static class ServiceFactory
{
private static readonly SAW_Registret.minService.WebService _service = new SAW_Registret.minService.WebService();
public static SAW_Registret.minService.WebService GetSAW_Registret()
{
return _service;
}
}
//sen har jag lagt
private SAW_Registret.minService.WebService service = Class.ServiceFactory.GetSAW_Registret();
//för att dra igång allt.
..ser det rätt ut?
Jag har hitintills inte fått något error... §jr