Si consideri il seguente classeCome creare un'interfaccia che mantenga alcuni metodi interni per i test in C#?
public class Entity {
public void Foo() { ... }
internal void Bar() { ... }
}
come si vede ha un metodo public
e un metodo di internal
. Ora, vorrei creare un'interfaccia che mi permetta di prendere in giro questa classe nei test (sia in questo assembly che in altri). Riscrivo il mio codice come segue:
public interface IEntity {
void Foo();
}
internal class Entity : IEntity {
public void Foo() { ... }
public void Bar() { ... }
}
Tuttavia, questo crea un altro problema. Quando si utilizza la classe in un altro metodo nella stessa assemblea non posso chiamare Bar
più:
public class OtherClass {
public void SomeMethod(IEntity entity) {
entity.Bar(); // error!
}
}
Riscrivere il codice in questo modo:
public class OtherClass {
public void SomeMethod(IEntity entity) {
(entity as Entity).Bar(); // error in test!
}
}
attiveranno un errore nel test di unità che fa scattare SomeMethod
. Come posso riscrivere il mio codice in modo da poter utilizzare ancora i metodi internal
nello stesso assembly e tuttavia esporre solo membri pubblici ad altri assembly?
Aggiornamento: Classe OtherClass
è una classe di utilità che ha bisogno di operare su interni della classe Entity
, che non sono esposti agli utenti direttamente. Tuttavia, questa classe è esposta agli utenti, quindi hanno indirettamente accesso agli interni di Entity
. Ciò è necessario poiché SomeMethod
eseguirà i controlli necessari per garantire che gli utenti non rovinino lo stato interno di un oggetto Entity
.
Perché non si limitano a rendere virtuali i metodi anziché creare un'interfaccia? – adrianm
@adrianm: Perché voglio anche un'interfaccia chiara per gli utenti, non confusa con membri privati / interni e implementazione. E anche perché mi piacerebbe essere in grado di fornire una diversa implementazione in futuro senza ricostruire tutti i progetti dipendenti. Tuttavia, considerando tutte le difficoltà, che le interfacce creano quando si hanno a che fare con membri interni, potrei scegliere questa opzione nonostante i suddetti vantaggi. –