3

我有许多保存和检索数据对象的静态存储库类。我想为它们提供一些通用功能,所以我让它们继承自一个抽象类。

这不起作用,因为不允许继承静态类。我相信 .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();
    }
}
4

1 回答 1

4

您可以static从继承类中删除 ,并通过隐藏构造函数使它们类似地工作:

public sealed class CreditMemos : InvoiceRepository<CreditMemo>
{
    private CreditMemos() { }
    ...

或者您可以InvoiceRepository<t>自己制作static class,而不是继承,您只需使用其他static classes 中的方法。(顺便说一句,约定是所有类型名称的第一个字母大写,包括泛型类型,所以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();
    }
}
于 2013-09-19T13:15:16.317 回答