webForumDet fria alternativet

partial class + dela metod

.NET

5 svar · 509 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

har en delad klass:

[B]Client.cb[/B]

public partial class Client
{
        private int _ClientID;
        private string _ClientName;

        public int ClientID
        {
            get { return _ClientID; }
            set { _ClientID = value; }
        }

        public string ClientName
        {
            get { return _ClientName; }
            set { _ClientName = value; }
        }
}

[B]Client_extended.cb[/B]
public partial class Client
{
        private int _CntCampaigns;

        public int CntCampaigns
        {
            get { return _CntCampaigns; }
            set { _CntCampaigns = value; }
        }
}

Sen har jag en metod i en managerklass:

[B]ClientManager.cb[/B]

public class ClientManager
{
        public Client Create(int clientID)
        {
            Client client = new Client();
            DataManager dm = new DataManager();
            SqlParameter[] param = { dm.AddParam("@ClientID", SqlDbType.Int, clientID) };
            SqlDataReader reader = null;

            try
            {
                reader = dm.GetReader(CommandType.StoredProcedure, "Client_GetClientByID", param);
                while (reader.Read())
                {
                    client.ClientID = (int)reader["ClientID"];
                    client.ClientName = (string)reader["ClientName"];
                }
            }

            finally
            {
                if(reader != null)
                    reader.Dispose();
            }

            return client;
            
        }
}

Metoden Create vill jag nu utöka med egenskapen CntCampaigns.
I stored proceduren finns detta värde, hur får jag in den i min class?
Kan jag göra metoden partial och få in värdet på så vis?
Jag vill mao. helst inte ändra i min befintliga ClientManager-fil utan den ska gå att använda utan CntCampaigns.

Förstår ni vad jag är ute efter? :D

Medlem sedan maj 20012 812 inlägg
#2

doggelito skrev:

Förstår ni vad jag är ute efter?

Ja, men jag har svårt att se att det skall gå och lösa. I .NET 2.0/3.0 så kan man inte har partial metodhs, kanske man kan det i 3.5 det vet jag inte. Jag har dock svårt att se att man skulle kunna det eftersom kompilatorn så fall på något magiskt sätt skulle räkna ut vilken kod segement som skulle komma först. I ditt fall så skulle den nya koden placeras inom while loopen och det är ganska magstarkt att begära att kompiltorn skall lista ut...

Det enda sättet jag ser är att du får göra en liknande metod som anropar databasen och hämtar cntCampaigns och från den metod som anropar Create så får du anropar den nya metoden Create2.

- M

Medlem sedan juni 20003 076 inlägg
#3

Mm, ju mer jag tänker på det, ju mer förstår jag att det är fel "approach" jag försökte med.
Men hur borde jag ha gjort detta då?

För om man utökar en klass via partial, arv eller dyligt så förändras ju själva selecten från databasen.
"Brukar" man göra som du skrev ovan att man helt enkelt skapar en Create2-metod för de utökade egenskaperna, eller finns det andra sätt?

Medlem sedan maj 20012 812 inlägg
#4

doggelito skrev:

För om man utökar en klass via partial, arv eller dyligt så förändras ju själva selecten från databasen.
"Brukar" man göra som du skrev ovan att man helt enkelt skapar en Create2-metod för de utökade egenskaperna, eller finns det andra sätt?

Jag vet inte hur andra brukar göra, men om jag utökar min klass Client så den får fler egenskaper så går jag in och ändrar i koden som läser från databasen så att alla egenskaper läses på ett och samma ställe. Det betyder att jag så fall hade gått in i Create metoden och lagt till rader som behövts för att egenskaperna skall få sina värden. Du vill ju uppenbarligen ha värden med dig till din klass så jag har lite svårt att se varför du inte vill ändra i din Create-metod?

Att skapa en Create2() metod är ingen bra lösning och det slutar bara med att du har kod på flera olika ställen som gör nästan samma sak, och i detta fall, faktiskt försämrar prestandan eftersom du så fall skulle göra 2 databasanrop istället för 1.

Varför vill du inte ändra i Create()-metoden. I min värld så står Create() (Init) för att göra det som man vill skall göras när man skapar/initaliserar klassen. Om du vill att alla egenskaper skall fyllas så bör koden ligga där också.

Sen tycker jag det är fel sätt att använda partial på som du gör i client. Jag ser absolut ingen som helst mening med att använda partial för att du lägger till en egenskap, gå in och ändra i den ursprungliga koden istället. Det finns ett tillfälle jag ser att man skall använda sig av partial och det är när man har kod som blir autogenererad, säg att du skapar din Client klass från ett genereringsverktyg, men du vill själv fylla klassen med olika sorters metoder. Där har du tillfället när du skall använda partial klass. Då lägger du alla metoder i en speciell partial klass och kan seda genererar om dina egenskaper hur många gånger som helst utan att dina metoder försvinner.

- M

Medlem sedan juni 20003 076 inlägg
#5

Det är nog fiffigast att jag förklarar vad jag bygger! :)

Jag har ett kundregister (Clientklassen) samt att jag nu ska bygga till en bannermodul.
I mitt admin skulle jag sedan bla. vilja se hur många kampanjer en kund har aktivt (CntCampaigns).
Grejjen är att kundregistret ska kunna användas utan bannermodulen, därav så vill jag inte ändra den ursprungliga Clientklassen.

Jag skulle ju kunna lösa det hela med att ha två separata hämtningar av data ur databasen, först hämta kunden, sedan skicka in kunden i bannerklassen och där hämta antalet kampanjer från databasen.

Jag tyckte bara att detta borde kunnas slås ihop (på nått finurligt OO vis) :)

En annan sak som säger emot mitt tillvägagångssätt är att jag anpassar SP:n för att hämta både kund och kampanjer och det borde jag inte göra då jag vill kunna använda kundregistret separat!

Hmm, jag får nog ta och tänka om! :)

Men hur gör jag om klasserna ska kunna "prata" med varann?
Ska jag skapa en kampanjklass som ärver kundklassen eller hur skulle det se ut i OO världen i detta scenario?

Medlem sedan maj 20012 812 inlägg
#6

Jag skulle skapa en ny tabel för bannermodulen där det finns en nyckel till Client. Likadant skulle jag skapa en ny klass för bannermodulen och ha en referens till clienten i denna klass.

Om du sedan löser det genom att låte bannermodulen ärva från client eller du skapar en fristående klass är svårt för mig att svara på, jag tycker dock inte att bannermodulen och clientklassen borde ha något med varandra att göra så arv låter inte som en lösning i mina örna, men jag har ju inte hela bilden.

Det skulle i vilket fall som helst bli flera databasanrop som du skulle behöva göra för att få till det så som du önskar.

- M

256 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)