控制方法返回的最佳模式

时间:2014-07-18 15:34:41

标签: c# .net design-patterns

是否有一种模式或最佳选择来改进此方法并减少重复的ifs?

我已经使用Adapter模式将接口转换为另一个接口。

public string GetInvoice(int id)
{
    // Search in Mongodb and get the object
    var invoice = MongoRepository.Get<IInvoiceEntity>(x => x.Invoice.Id == id)
        .First();

    if (invoice == null) 
    {
        // Search in SQL
        invoice = EFRepository.Get<IInvoiceEntity>(x => x.Invoice.Id == id)
            .First();
    }

    if (invoice == null)
    {
        // This invoice is an old system item
        var oldInvoice = WCFClient.InvoiceService.Get(id);

        var adapter = new OldInvoiceAdapter(oldInvoice);
        invoice = adapter.AdaptEntity();
    }

    return invoce.ToJson();
}

谢谢!

2 个答案:

答案 0 :(得分:5)

我提取了将发票纳入方法的各种策略(这样可以避免大部分评论的需要),然后简化这种方法,如下所示:

var invoice = GetInvoiceFromMongoDb(id) 
       ?? GetInvoiceFromSql(id)
       ?? GetOldSystemInvoice(id);

return invoce.ToJson();

这使您的方法非常容易理解,并将您的代码分解为模块,这可能会帮助您更好地遵循单一责任原则。

答案 1 :(得分:4)

返回给定值的模式如果它不为null并且如果它为null则使用不同的值正是null康复运算符(??)的作用。这可以帮助你写:

var invoice = GetFromMongo(id) ?? GetFromSQL(id) ?? GetFromOldArchive(id);
return invoice.ToJson();