Domanda

Sto cercando di correggere un difetto di progettazione che ho riscontrato di recente in alcuni dei nostri software senza riscrivere l'intera cosa. Esiste un file .exe che ha un thread di listener di messaggi che sta ricevendo dati da alcuni server e quindi scrivendolo in una classe in una DLL separata (lo chiameremo StaticDataClass) che memorizza tutti i dati che riceve (principalmente statici estratto da un database all'avvio). Questa classe fornisce anche metodi che altre classi possono utilizzare per recuperare i dati. Il problema è che i metodi store (set) sono tutti pubblici, quindi qualsiasi altra classe può sovrascrivere questi dati e rompere l'intera applicazione. Qual è un buon modo per proteggere i dati (rendere invisibili i metodi set / store) a tutti gli oggetti tranne quelli contenuti nell'eseguibile stesso?

In questo momento sto giocando con un'interfaccia che definisce solo i getter pubblici, e quindi avere una classe singleton implementa quell'interfaccia e quindi la proprietà Instance restituirà il tipo di interfaccia in modo che possano usare solo i metodi get dichiarati nell'interfaccia. Ma quando si avvia l'eseguibile, otterrà in qualche modo un riferimento effettivo all'oggetto StaticDataClass e non al tipo di interfaccia, quindi sarà anche in grado di chiamare i metodi store / set.

Questa non è una prova totalmente completa, ma impedisce ad alcuni sviluppatori che non hanno familiarità con il sistema di pensare che sia giusto usare questi metodi di archiviazione pubblica perché Visual Studio intellitype li rende visibili durante la codifica. Dovranno invece provare a romperlo lanciando l'oggetto come il tipo che contiene i metodi store.

C'è un modo più pulito per farlo?

È stato utile?

Soluzione

È possibile rendere interni i metodi impostati e utilizzare InternalsVisibleToAttribute per concedere l'accesso all'eseguibile preferito.

Altri suggerimenti

Sono d'accordo: rendere visibili gli interni all'assembly di fiducia sembra il modo più semplice per ottenere ciò che vuoi fare.

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