我怀疑我在这里犯了一个小学生错误,正在寻求澄清。我的解决方案(C#)中有很多类-敢于说大多数-我最终为之编写了相应的接口。例如,即使我永远不可能用其他实现替换该计算器,也可以使用“ ICalculator”接口和实现该接口的“ Calculator”类。而且,这些类中的大多数与其依赖项都位于同一个项目中-实际上,它们仅需为internal
,但最终成为public
实现其各自接口的副作用。
我认为这种为所有内容创建接口的做法源于一些谬误:
1)我本来以为创建单元测试模拟必须有一个接口(我使用的是Moq),但是后来我发现,如果类的成员为virtual
,则可以模拟该类,并且该类具有无参数的构造函数(如果我错了)。
2)我本来以为必须要有一个接口才能向IoC框架(Castle Windsor)注册一个类,例如
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
实际上,我可以针对自身注册具体类型:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3)使用接口(例如,用于依赖项注入的构造函数参数)会导致“松散耦合”。
那我对接口发疯了吗?!我知道您通常会“使用”接口(例如公开公共API)或“可插入”功能之类的场景。我的解决方案只有少数适合此类用例的类,但我想知道是否所有其他接口都是不必要的,应该删除?关于上述第3点,如果这样做,我是否会违反“松散耦合”?
编辑:-我只是在玩Moq,它似乎要求方法是公共的和虚拟的,并具有公共的无参数构造函数,以便能够模拟它们。这样看来我不能拥有内部类了吗?