8

Che tipo di cose hai usato attributi .NET personalizzati nel mondo reale?Uso del mondo reale di attributi personalizzati .NET

Ho letto diversi articoli su di essi, ma non ho mai usato attributi personalizzati.

Mi sento come se potessi trascurarli quando potrebbero essere utili.

Sto parlando di attributi che si creano, non di quelli già inclusi nel framework.

+2

Ecco come gli altri SOFlow li usano: http://www.google.com/#hl=en&q=site%3Astackoverflow.com+.net+custom+attribute&aq=f&oq=&aqi=&fp=leBsIIJAIN0 – Sampson

risposta

4

Ho usato gli attributi "personalizzati" per la convalida (ovvero contrassegnando un campo per essere convalidato con la mia "convalida della carta di credito") e gli analizzatori LinqToLucene personalizzati che ho scritto (ad esempio specificando quale analizzatore usare su un determinato campo).

il codice di convalida, per esempio, sarebbe simile a questa:

public class Customer 
{ 
    [CreditCardValidator] 
    string creditCardNumber; 

    [AddressValidator] 
    string addressLineOne 
} 

Quando l'oggetto di cui sopra viene convalidato, ogni campo viene convalidato con il validatore appropriati grazie alla attributo "personalizzato".

Nel materiale LinqToLucene ho scritto che gli attributi personalizzati sono carini perché consentono di trovare (attraverso la riflessione) campi specifici in fase di esecuzione. Ad esempio, se hai un oggetto cliente, potresti essere interessato a ottenere tutte le proprietà che sono state contrassegnate come "indicizzate": un attributo personalizzato ti consente di farlo facilmente poiché espone i meta-dati sull'oggetto in un modo che è facile da interrogare.

0

Ho dovuto serializzare alcuni oggetti in un formato personalizzato (legacy) e ho utilizzato gli attributi per identificare quali campi devono essere serializzati e come formattarli. Poi ho avuto un serializzatore che poteva prendere qualsiasi oggetto con questi attributi e usare il reflection per formattarlo.

+0

Non eri usando davvero i tuoi attributi personalizzati, vero? –

+0

heeeeeeeeeeeeee – abmv

0

L'ho usato in uno dei framework ORM che ho sviluppato in base al pattern ActiveRecord. Questo è lo stesso tipo di implementazione disponibile in LINQ, progetto Castle ecc.

Il framework era chiamato "SkyFramework", ma non era opensource.

per es. Un semplice esempio ...

Troverete esempi simili anche in altri progetti opensource.

[Sky.Table ("user")] 
public class User 
{ 
    [Sky.Column ("username")] 
    public string UserName; 

    [Sky.Column ("pwd")] 
    public string Password; 
} 

NOTA: L'attributo "Table", "Colonne" erano gli attributi personalizzati in quel momento.

Il motore ActiveRecord analizza l'oggetto per questi attributi e genera le rispettive funzioni CRUD ... ecc ...

Analogamente, avevo sviluppato alcuni attributi personalizzati per identificare porzioni di codice che deve essere benchmark. .. per es .:

[Sky.BenchMark()] 
public void LongRunningMethod(..) 
{ 
} 

I metodi contrassegnati con gli attributi di cui sopra sono automaticamente contrassegnati dal banco e viene generato un registro. Queste erano alcune implementazioni precedenti.

C'è un libro di Apress disponibile sull'argomento .. Applied .NET Attribues che può essere di aiuto a voi.

+0

Hai scritto gli attributi? –

+0

La tabella, la colonna, BenchMark ecc. Sono oggetti derivati ​​dalla classe Attribute. Oltre al parser, i motori si occupano di gestirlo. Questi oggetti sono sempre istanziati da alcune classi di fabbrica, in modo da poterti collegare ai metodi. –

+0

E per favore non confondetevi con l'attributo simile per LINQ che avete ora. Questo è un vecchio bit di codice con dove gli attributi giacevano nel proprio spazio dei nomi. –

1

Tra le altre cose, li ho usati per specificare EBNF che viene letto in fase di esecuzione per creare al volo parser personalizzati e anche per specificare i metadati relativi ai campi per un database.

Trovo che uno "schema" che uso comunemente attributi personalizzati sia quello di sostituire le enumerazioni soprattutto quando c'è una dipendenza dall'en in punti di diff nel codice.

E.g. Potrei avere un enum per uno stato di un oggetto. Sulla base di questo stato, ho forse 3 o 4 posti diversi nel codice che vorrei fare un "passaggio" di quell'enumerazione ed eseguire qualche operazione. Qualche altro sviluppatore potrebbe facilmente introdurre un bug aggiungendo una nuova enumerazione ma non gestendo una delle istruzioni switch da qualche altra parte nel codice.

Quindi per evitare questo, creo un attributo personalizzato dichiarato a una classe statica. Gli attributi personalizzati vengono caricati nel costruttore statico della classe in un dizionario e tutte le posizioni nel codice utilizzano il dizionario anziché le istruzioni switch. Il costruttore dell'attributo personalizzato contiene i valori 'hardcoded' per ogni istruzione switch.

5

Ho creato un motore di scripting e ho taggato vari metodi con l'attributo [Command]. Ciò significava che queste funzioni erano esposte al motore di scripting.

Esempio:

[Command(HelpText = "Lists active users")] 
void ListUsers(void) 
{ 

} 

[Command(HelpText = "Terminate a specific user's connection")] 
void EndConnection(int userID) 
{ 

} 

E usati:

MyScriptEngine>> Help 
Available Commands are: 
    ListUsers: Lists active users 
    EndConnection {userID}: Terminate a specific user's connection 

MyScriptEngine>> EndConnection 3 
    User 3 (Michael) has had his connection terminated. 

MyScriptEngine>> 
0

non ho davvero trovato un impiego per attributi personalizzati come ancora. Ci sono state alcune situazioni in cui potrei essere appropriato ma non li ho usati perché apparentemente il riflesso coinvolto nella lettura di attributi personalizzati è piuttosto costoso.

0

Ho inserito attributi personalizzati su classi all'interno di DLL "plug-in". Ciò consente a un framework di scoprire dinamicamente i plug-in disponibili, valutare se sono di interesse e quindi caricare dinamicamente quelli di interesse.

Nel nostro dominio, l'esempio è plug-in che modellano veicoli particolari all'interno di una famiglia. Un plug-in per una famiglia di veicoli potrebbe effettivamente modellare diversi modelli di veicoli all'interno della famiglia di veicoli (ad es. "MX-6", "Sonda"). Se un ID o nome modello è incluso come array di attributi personalizzato, possiamo ignorare rapidamente qualsiasi DLL che non ha nemmeno attributi personalizzati e quindi ignorare ulteriormente quelli che non modellano il veicolo di interesse.

Problemi correlati