考虑下面的类
public class Entity {
public void Foo() { ... }
internal void Bar() { ... }
}
如您所见,它有一个public
方法和一个internal
方法。现在,我想创建一个接口,允许我在测试中模拟这个类(在这个程序集中和其他程序集中)。我重写我的代码如下:
public interface IEntity {
void Foo();
}
internal class Entity : IEntity {
public void Foo() { ... }
public void Bar() { ... }
}
但是,这会产生另一个问题。当在同一个程序集中的另一个方法中使用该类时,我不能再调用Bar
了:
public class OtherClass {
public void SomeMethod(IEntity entity) {
entity.Bar(); // error!
}
}
像这样重写代码:
public class OtherClass {
public void SomeMethod(IEntity entity) {
(entity as Entity).Bar(); // error in test!
}
}
将在触发的单元测试中触发错误SomeMethod
。如何重写我的代码,以便我仍然可以internal
在同一个程序集中使用方法,但只将公共成员公开给其他程序集?
更新:类OtherClass
是一个实用类,需要对Entity
类的内部进行操作,这些内部不直接暴露给用户。然而,这个类本身是暴露给用户的,所以他们间接地可以访问Entity
. 这是需要的,因为SomeMethod
将执行必要的检查以确保用户不会搞砸Entity
对象的内部状态。