我正在開發一個小系統,我開發了經典的通用庫。目前,我的DAL具有以下架構。在需要時,從接口投射到某個具體類是否是一種很好的做法?
public interface IRepositorio<T> where T : class
{
T Get(long id);
long Insert(T obj);
bool Update(T obj);
bool Delete(T obj);
}
public abstract class Repositorio<T> : IRepositorio<T> where T : class
{
public IDbConnection Connection
{
get
{
return new SqlConnection(ConfigurationManager.ConnectionStrings["DBFila"].ConnectionString);
}
}
public T Get(long id)
{
//...
}
public long Insert(T obj)
{
//...
}
public bool Update(T obj)
{
//...
}
public bool Delete(T obj)
{
//...
}
}
我的具體資料庫看起來是這樣的:
public class FilaRepositorio : Repositorio<FilaRepositorio>
{
public FilaRepositorio()
{
}
public void SomeCustomMethod()
{
// Some custom method
}
}
我也是用簡單的注射器遵循國際奧委會和DI模式,因爲這個原因,當我嘗試調用「SomeCustomMethod()」我(顯然)沒有訪問權限。看:
public class Processador
{
private IRepositorio<FilaModel> _repoFila;
public Processador(IRepositorio<FilaModel> repoFila)
{
_repoFila = repoFila;
}
public void Processar()
{
_repoFila.SomeCustomMethod(); // <-- wrong
((FilaRepositorio)_repoFila).SomeCustomMethod();// <-- works
}
}
有鑑於此,我有一些問題:
- 是個好或可接受的做法使該投(FilaRepositorio)?
- 如果不是一個好的做法,該如何爲這種情況編寫好的代碼?
如前所述兩個答案,從界面回實現鑄造是一個壞主意。如果你這樣做,絕對沒有理由再有這個接口。更一般地說,如果你的代碼依賴於一個具體的類型,你就違反了[依賴倒置原則](https://en.wikipedia.org/wiki/Dependency_inversion_principle),它指出類應該依賴於抽象。此外,明確將界面轉換爲這種具體類型違反了[Liskov替代原則](https://en.wikipedia.org/wiki/Liskov_substitution_principle)。 – Steven
海事組織,我不認爲這個問題是「主要是基於意見的」,因此它不應該被關閉。文獻和共同設計原則在這方面非常明確,所以這個問題實際上可以通過參考文獻相當客觀地回答(正如我以前的評論中所做的那樣)。 – Steven