Domanda

Per che tipo di cose hai usato attributi .NET personalizzati nel mondo reale?

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 crei, non di quelli che sono già inclusi nel framework.

È stato utile?

Soluzione

Li ho usati " personalizzato " attributi per la validazione (es. segnando un campo da validare con la mia "validazione della carta di credito") e analizzatori LinqToLucene personalizzati che ho scritto (es. specificando quale analizzatore usare su un dato campo).

Il codice di convalida, ad esempio, sarebbe simile a questo:

public class Customer
{
     [CreditCardValidator]
     string creditCardNumber;

     [AddressValidator]
     string addressLineOne
}

Quando l'oggetto sopra è convalidato, ogni campo viene convalidato con l'apposito validatore grazie a " custom " attributo.

Nelle cose di LinqToLucene che ho scritto gli attributi personalizzati sono belli perché ti permettono 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 "indicizzami": un attributo personalizzato ti consente di farlo facilmente poiché espone i metadati sull'oggetto in un modo è facile da interrogare.

Altri suggerimenti

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 come usato:

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>>

Tra l'altro, li ho usati per specificare EBNF che viene letto in fase di esecuzione per creare al volo parser personalizzati e anche per specificare metadati sui campi per un database.

Trovo che uno 'schema' che sto comunemente usando gli attributi personalizzati sia quello di sostituire gli enum specialmente quando c'è una dipendenza dall'enum in posizioni diff nel codice.

es. Potrei avere un enum per lo stato di un oggetto. Sulla base di questo stato, ho forse 3 o 4 posti diversi nel codice che farei un "cambio" di quell'enum ed eseguirò qualche operazione. Alcuni altri sviluppatori potrebbero facilmente introdurre un bug aggiungendo un nuovo enum ma non gestendolo in una delle istruzioni switch da qualche altra parte nel codice.

Quindi, per evitare ciò, 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 ciascuna istruzione switch.

Ho dovuto serializzare alcuni oggetti in un formato personalizzato (legacy) e ho usato 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 la riflessione per formattarlo.

Non ho ancora trovato un uso per gli attributi personalizzati. Ci sono state alcune situazioni in cui ho pensato che potrebbero essere appropriate ma non le ho usate perché apparentemente la riflessione implicata nella lettura degli attributi personalizzati è piuttosto costosa.

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

Nel nostro dominio, l'esempio sono i plug-in che modellano determinati veicoli 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 un array di attributi personalizzati, possiamo ignorare rapidamente qualsiasi DLL che non ha nemmeno attributi personalizzati e quindi ignorare ulteriormente quelli che non modellano il veicolo di interesse.

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

Il framework era chiamato " SkyFramework " ;, ma non era open source.

per es. Solo un esempio approssimativo ...

Troverai 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 " Tabella " ;, " Colonne " erano gli attributi personalizzati a quel tempo.

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

Allo stesso modo, avevo sviluppato alcuni attributi personalizzati per identificare parti di codice che devono essere confrontate ... per es.

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

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

C'è un libro Apress disponibile sull'argomento .. Attributi .NET applicati che potrebbero esserti utili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top