任何人都可以帮忙,我有一个小问题,我有一个界面,也有一个基础界面,当我尝试做
.Dispose()
它没有找到它在我的子类NOT base上实现的方法..它似乎总是想要调用基类 - 即使我特意将命名空间放在构造函数的参数前面。
这里有一些代码可以更好地解释它,基本上有2个IhouseRepository(接口),1个是基本接口,1个是子类接口。
在构造函数中,我专门说了MarkSmith.Data(而不是MarkSmith.DataBase),但它仍然保持拾取未实现Dispose的DataBase版本。
我的想法是在所有子类中实现IDisposable,并且应该负责处理。
在构造函数中,我有一行调用IhouseRepository并且我“CAN”访问Dispose - 所以它确实有效 - 为什么它在这里工作而不是传递给构造函数的param是一个谜: - )< / p>
但是构造函数上的参数似乎强制命名空间DataBase而不是Data
我想我可以将基础项目上的所有接口重命名为IHouseRepositoryBase,但我不明白为什么会发生这种情况。
任何帮助真的很感激
public class HouseService : ServiceBase.HouseService, IHouseService
{
public HouseService(MarkSmith.Data.IHouseRepository repository)
: base(repository)
{
MarkSmith.Data.IHouseRepository test =
new MarkSmith.Data.HouseRepository(new MyDataContext);
test.Dispose(); // THIS WORKS! NO PROBLEMS
}
// Dispose() calls Dispose(true)
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// free managed resources
if (repository != null)
{
repository.Dispose(); // THIS FAILS .. IT IS CALLING NS DATABASE
}
}
答案 0 :(得分:4)
您的重载Dispose()
方法是否需要virtual
,以便子类可以覆盖其实现?否则,最终被调用的方法将取决于您调用它的接口。
此外,如果需要所有子类来实现IDisposable
,那么基类也应该实现IDisposable
- 这会导致编译器强制执行它。
答案 1 :(得分:1)
如果您遵循推荐的模式,那么HouseRepository中的Dispose方法不是虚拟的。这意味着将根据您用于访问它的变量的类型(而不是变量中的实例类型)静态确定将调用哪一个。
这只是一般注意事项,但这是我可以做的,因为在您的代码示例中,存储库的成员定义不存在。