【发布时间】:2023-03-20 10:00:01
【问题描述】:
我正在开发一个小型系统,并且我开发了经典的通用存储库。目前,我的 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
}
}
我也在使用 Simple Injector 来遵循 IoC 和 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) 是一种好的或可接受的做法吗?
- 如果这不是一个好的做法,如何为这种情况编写好的代码?
【问题讨论】:
-
正如两个答案已经描述的那样,从接口转换回实现是一个坏主意。如果你这样做,绝对没有理由再拥有这个界面。更一般地说,如果您的代码依赖于具体类型,则您违反了Dependency Inversion Principle 声明类应该依赖于抽象的规定。此外,将接口显式转换为这种具体类型违反了Liskov Substitution Principle。
-
IMO,我不认为这个问题“主要基于意见”,因此它应该不被关闭。文献和常见的设计原则对此非常清楚,所以这个问题实际上可以通过参考文献来相当客观地回答(就像我在之前的评论中所做的那样)。
标签: c# oop design-patterns dependency-injection simple-injector