我想重構項目中的一些類,使它們可以使用接口和依賴注入進行測試。但我與以下幾點:c#依賴注入接口和隱藏內部
public interface IInterfaceA
{
void SomePublicMethod();
}
public class ConcreteObject : IInterfaceA
{
public void SomePublicMethod() { ... }
public void SomeOhterMethod() { ... }
public void YetAnotherMethod() { ... }
}
public class AnotherConcreteObject
{
private IInterfaceA _myDependency;
public AnotherConcreteObject(IInterfaceA myDependency)
{
_myDependency=myDependency;
}
}
到目前爲止一切都很好,很標準的代碼。 AnotherConcreteObject需要調用SomeOtherMethod,但我不希望其他類(例如不同的程序集)能夠調用SomeOtherMethod。所以外部SomePublicMethod應該是可見的,但SomeOtherMethod不應該是。只有AnotherConcreteObject的實例應該能夠調用SomeOtherMethod。 SomeOtherMethod將例如設置一個內部屬性,稍後由YetAnotherMethod使用來確定應該發生什麼。在所有其他情況下,內部屬性被設置爲默認值,例如當另一個方法從AnotherConcretObject之外的任何其他類中調用時。
當不使用接口時,這是可能的,因爲AnotherConcreteObject與ConcreteObject在同一個程序集中,所以它可以訪問內部屬性和方法。不同程序集中的類不能設置此屬性或調用方法,因爲它們無法訪問內部屬性和方法。
如果'AnotherConcreteObject'需要調用不在公共接口中的東西,那麼它應該依賴於'ConcreteObject'而不是接口 - 或者可能另一個暴露'SomeOtherMethod'的接口。 –
但是如果AnotherConcreteObject直接依賴於Concrete對象,這是不是使AnotherConcreteObject更難測試(或不可能)?我希望AnotherConcreteObject可以使用嘲諷進行測試 – rekna
由於AnotherConcreteObject調用的實例SomeOtherMethod設置了內部屬性,您是否遇到了測試AnotherConcreteObject的問題? – Spock