【发布时间】:2015-07-07 14:40:20
【问题描述】:
好吧,我对 C# 中的泛型有点迷茫
我有这个通用接口
interface IInvoiceStorage<T>
where T : class
{
void Persist(T Invoice);
}
两个类实现接口
public class FacturaStorageForSQLServer:IInvoiceStorage<EVT>
{
public void Persist(EVT Invoice)
{
/*Implementation*/
}
}
public class FacturaStorageForMySQLServer:IInvoiceStorage<EVTFruit>
{
public void Persist(EVTFruit Invoice)
{
/*Implementation*/
}
}
当我想在我的服务类中声明这个时问题就来了
public class invoice_service
{
IInvoiceStorage Storage;
public invoice_service(IInvoiceStorage storage)
{
Storage=_storage;
}
}
C# 告诉我必须声明接口的 de 类型,但如果我这样做了,那么我的服务类将依赖于实现而不是接口。
建议??
更新 1: 抱歉,如果我声明该类型,则接口将仅依赖于使用该类型的实现,但是如果我有两个使用两种不同类型(例如 EVT 和 EVTFruit)的实现会发生什么。
我正在考虑使用另一个接口来建立 EVT 和 EVTFruit 之间的关系,但它们可能是两个完全不同的对象,所以我不确定这是否是个好主意。
【问题讨论】:
-
您需要声明接口的类型参数 IInvoiceStorage
,而不是该接口实际实现的类型。 -
你打算在你的
invoice_service类中传递什么样的对象到Storage.Persist()?这些对象的类型与EVTFruit和EVT有什么关系?
标签: c# generics interface decoupling