我有许多静态存储库类来保存和检索数据对象。我想为它们提供一些常用功能,所以我让它们从一个抽象类继承。
这不起作用,因为不允许静态类继承。我相信.NET设计,所以我会接受这是有充分理由的。
所以这让我相信我在这里有一些基本的设计问题。
我的问题是如何设计我的代码以实现我正在寻找的结果?或者,只是必须在我的所有类中复制方法。也许是单身人士?
静态回购:
public static class CreditMemos : InvoiceRepository<CreditMemo>
{
public static List<CreditMemo> GetByDocumentNumber(string documentNumber)
{
return CheckCache(
ConvertReaderToCreditMemos(
Invoices.GetByDocumentNumber<CreditMemo>(documentNumber)));
}
}
所需基数:
abstract class InvoiceRepository<t>
where t: DataObjects.Invoice
{
static List<t> invoiceCache = new List<t>();
static protected List<t> CheckCache(List<t> results)
{
foreach (var result in results)
if (!invoiceCache.Any(p => p.ID == result.ID))
invoiceCache.Add(result);
return invoiceCache.Where(p => results.Any(a => a.ID == p.ID)).ToList();
}
}
答案 0 :(得分:4)
您可以从继承类中删除static
,并通过隐藏构造函数使它们的工作方式类似:
public sealed class CreditMemos : InvoiceRepository<CreditMemo>
{
private CreditMemos() { }
...
或者您可以将InvoiceRepository<t>
设为自己的static class
,而不是继承,只需使用其他static class
es中的方法即可。 (顺便说一句,约定是将所有类型名称中的第一个字母大写,包括泛型类型,因此T
,而不是t
)
public static class CreditMemos
{
public static List<CreditMemo> GetByDocumentNumber(string documentNumber)
{
return InvoiceRepository<CreditMemo>.CheckCache(new List<CreditMemo>());
}
}
public static class InvoiceRepository<T>
where T: DataObjects.Invoice
{
static List<T> invoiceCache = new List<T>();
static internal List<T> CheckCache(List<T> results)
{
foreach (var result in results)
if (!invoiceCache.Any(p => p.ID == result.ID))
invoiceCache.Add(result);
return invoiceCache.Where(p => results.Any(a => a.ID == p.ID)).ToList();
}
}