Ho un assembly .NET, da rilasciare. La sua build di rilascio comprende:Nascondi metodo pubblico utilizzato per testare un assembly .NET
- A, API documentata pubblica di metodi che la gente si suppone di utilizzare
- un'API pubblica, ma non documentata di altri metodi, che esistono solo al fine di aiutare a testare l'assemblaggio, e che la gente non dovrebbero usare
L'assembly da rilasciare è un controllo personalizzato, non un'applicazione. Per eseguire il test di regressione, lo eseguo in un framework/applicazione di test, che utilizza (oltre all'API pubblica/documentata) alcuni metodi avanzati/non documentati che vengono esportati dal controllo.
Per i metodi pubblici che non voglio persone di utilizzare, li escluso dalla documentazione utilizzando la <exclude>
tag (supportato dal Costruttore Sandcastle File della Guida), e l'attributo [EditorBrowsable]
, per esempio come questo:
/// <summary>
/// Gets a <see cref="IEditorTransaction"/> instance, which helps
/// to combine several DOM edits into a single transaction, which
/// can be undone and redone as if they were a single, atomic operation.
/// </summary>
/// <returns>A <see cref="IEditorTransaction"/> instance.</returns>
IEditorTransaction createEditorTransaction();
/// <exclude/>
[EditorBrowsable(EditorBrowsableState.Never)]
void debugDumpBlocks(TextWriter output);
Questo rimuove con successo il metodo dalla documentazione API e da Intellisense. Tuttavia, se in un programma applicativo di esempio right-click su un'istanza dell'interfaccia di vedere la definizione nel metadati, posso ancora vedere il metodo e il [EditorBrowsable]
attributo così, ad esempio:
// Summary:
// Gets a ModelText.ModelDom.Nodes.IEditorTransaction instance, which helps
// to combine several DOM edits into a single transaction, which can be undone
// and redone as if they were a single, atomic operation.
//
// Returns:
// A ModelText.ModelDom.Nodes.IEditorTransaction instance.
IEditorTransaction createEditorTransaction();
//
[EditorBrowsable(EditorBrowsableState.Never)]
void debugDumpBlocks(TextWriter output);
Domande:
- c'è un modo per nascondere un metodo pubblico, anche da metadati?
- In caso contrario, per questo scenario, si consiglia di eseguire i metodi
internal
e utilizzare l'attributoInternalsVisibleTo
? O consiglieresti un altro modo, e se sì, cosa e perché?
Grazie.
Suggerirei una progettazione adeguata che non richieda di esporre pubblicamente il codice che preferiresti nascondere. –
Concordato con Mark. Dovresti essere in grado di testare tutto il tuo codice attraverso le sue interfacce pubbliche senza dover creare metodi pubblici e/o interni "nascosti". –
@ Mark I am [test del codice tramite interfacce pubbliche] (http://stackoverflow.com/questions/856115), tuttavia per aiutare il test di regressione ho alcuni metodi aggiuntivi, ad es. che esegue il dump dello stato interno del controllo: in modo che il test case possa affermare lo stato interno (non documentato) dopo vari eventi di input (pubblici, documentati). – ChrisW