【问题标题】:Avoid code repetition in c# - by using generics?避免 C# 中的代码重复 - 通过使用泛型?
【发布时间】:2015-12-07 09:58:10
【问题描述】:

我在控制器代码中有以下代码:

public async Task<int> PullClientsAsync()
{
    var service = new DesktopConnectorService<ClientModel>(
            new WapiRepository<ClientModel>(), new QuickBooksRepository<ClientModel>());
    var filter = new ClientSearchFilter();
    try
    {
        var items = await service.GetItemsAsync(filter);
        return items.Count;
    }
    catch (Exception ex)
    {


    }
    return 0;
}

public async Task<int> PullInvoicesAsync()
{
    var service = new DesktopConnectorService<InvoiceModel>(
        new WapiRepository<InvoiceModel>(), new QuickBooksRepository<InvoiceModel>());
    var filter = new InvoicesSearchFilter();
    try
    {
        var items = await service.GetItemsAsync(filter);
        return items.Count;
    }
    catch (Exception ex)
    {


    }
    return 0;
}

public async Task<int> PullPaymentsAsync()
{
    var service = new DesktopConnectorService<PaymentModel>(
        new WapiRepository<PaymentModel>(), new QuickBooksRepository<PaymentModel>());
    var filter = new PaymentSearchFilter();
    try
    {
        var items = await service.GetItemsAsync(filter);
        return items.Count;
    }
    catch (Exception ex)
    {


    }
    return 0;
}

如您所见,它涉及三种类型(ClientModel、PaymentModel 和 Invoices 模型)。上面的很多代码都是重复的。

但我相信它可以被简化。知道如何实现吗?

谢谢

【问题讨论】:

    标签: c# .net generics


    【解决方案1】:

    如果所有模型和过滤器共享一个公共接口/基类,您可以这样做:

    public async Task<int> PullAsync<TModel, TFilter>() 
                           where TModel : IModel, 
                           where TFilter : IFilter, new();
    {
        var service = new DesktopConnectorService<TModel>(
                        new WapiRepository<TModel>(), new QuickBooksRepository<TModel>());
        var filter = new TFilter();
        try
        {
            var items = await service.GetItemsAsync(filter);
            return items.Count;
        }
        catch (Exception ex)
        {
        }
        return 0;
    }
    

    旁注 - 不要像那样使用空的 catch 块,它们会吞下异常,从而很难诊断可能在以后发生的问题。至少在那里有一个日志记录语句,或者做一些有意义的事情。否则,我会删除它。

    【讨论】:

    • 澄清一下,最后 Yuval 的段落:吞下异常是不好的,因为当你这样做时,如果你的程序行为不端,你不会立即得到反馈。当它发生时,它使查找问题变得更加困难,因为您的代码正在主动隐藏它。如果您在整个代码中始终吞下异常,那么您的软件就会变得一团糟。
    最近更新 更多