给出以下类:
public interface ISession {}
public class Session : ISession
{
internal Uri ServerUri { get; private set; } // not in interface obviously
}
Run Code Online (Sandbox Code Playgroud)
现在我在同一个项目中有另一个类依赖于Session:
public interface IDataClass {}
internal DataClass : IDataClass
{
private readonly Session _session;
public DataClass(ISession session)
{
_session = (Session) session;
}
// some more methods that access the internal property _session.ServerUri
// and call methods on the session object
// ...
}
Run Code Online (Sandbox Code Playgroud)
实际上,Session类非常复杂.对于单元测试,DataClass我创建了构造函数参数ISession,因此我能够模拟依赖项并验证ISession模拟上的某些方法调用.
但是,有些方法DataClass必须访问_session.ServerUri属性,因此字段必须是类型Session而不是ISession.
ISession每次访问内部属性时,我也可以创建类型字段并转换字段,这将使得在此特定位置更清楚为什么internal甚至需要混凝土类.
每次我以上述方式实现强制转换时,我都想知道如果有更好的代码设计,可以避免使用强制转换.我经常找到一个更好的方法,摆脱演员阵容.
但是上面的例子怎么样?这是好的代码设计吗?还是有更干净的方式?我只是觉得从构造函数初始化字段上面的方式很奇怪.
老实说,我认为你现在的系统并不是一个好主意.
你的构造函数声明"只要它实现就会占用任何东西ISession",但这并不是真的 - 调用代码可以InvalidCastException在尝试创建DataClass实例时找到它.
所以你真的应该ServerUri在继承ISession 或继承的接口中声明ISession- 但在任何一种情况下,你都需要通过接口声明(并存储)这个依赖DataClass
| 归档时间: |
|
| 查看次数: |
423 次 |
| 最近记录: |