2

我的 DAL 中有几种方法,有很多参数:

public Collection<Proforma> SearchAllProforma(DateTime? startDate = null, DateTime? endDate = null,
        int? institutionID = null, int? inspectionID = null, bool? isFollowup = null, bool? excludeDeleted = null,
        bool? nutritionalOnly = null, int? parentInspectionID = null)

我应该把这些浓缩成一个对象参数吗?或者使用可选参数让它们保持原样?或两者?

编辑 - 我真的应该说,这些参数中的每一个都映射到存储过程的参数。

4

7 回答 7

1

Should I condense these down to take an object parameter?

Not necessarily. The default values seem okay (I assume your function can handle null parameters without issue). If you're using a recent version of C# you can call this function like:

SearchAllProforma(institutionID: 33);

Which isn't all that bad, in my opinion.

于 2012-05-24T09:17:52.497 回答
1

我建议您为所有这些参数创建一个类作为属性。

然后将类作为参数发送。

Class SerachAllProformaParameter
{
//All Properties.
}

SerachAllProformaParameter parameter= new SerachAllProformaParameter();
parameter.PropertyName="value";

public Collection<RoIVProforma> SearchAllProforma(parameter);
于 2012-05-24T09:22:54.717 回答
0

考虑到它们中的很多都有它们的默认值,从可用性的角度来看,我会用不同数量的参数添加这个方法的几个覆盖

这样,对于您的方法的消费者来说,在无需在智能感知窗口中看到所有参数的情况下,更容易选择合适的方法。

public Collection<RoIVProforma> SearchAllProforma(DateTime? startDate = null) 
{
   ...
}

public Collection<RoIVProforma> SearchAllProforma(DateTime? startDate = null, DateTime? endDate = null)
{
 ...
}

public Collection<RoIVProforma> SearchAllProforma(DateTime? startDate = null, DateTime? endDate = null,
        int? institutionID = null)
{
 ...
}

...
于 2012-05-24T09:15:21.637 回答
0

我应该把这些浓缩成一个对象参数吗?

是的,一点没错。看着这个方法签名让我的眼睛开始流血。

于 2012-05-24T09:15:34.340 回答
0

就个人而言,这里最好的方法是将一个Expression<Func<RoIVProforma, bool>>实例传递给 SearchAllProforma 方法。但是,如果您的 DAL 不使用任何基于 LINQ 的底层数据源,则更难实现解析表达式。
同时,具有许多可选参数的方法是最差的。

于 2012-05-24T09:16:11.733 回答
0

使用对象作为参数,这是一个很好的方法..

于 2012-05-24T09:16:14.497 回答
0

如果所有参数都属于您的某个实体,您可以将谓词 lambda 表达式传递给该方法。

我使用以下方法在我的实体中搜索一些标准。

public List<Personel> GetAll(Func<Personel, bool> predicate = null)
        {
            List<Personel> result = new List<Personel>();

            if (predicate == null)
            {
                result = personelRepo.Table.ToList();
            }
            else
            {
                foreach (var item in personelRepo.Table)
                {
                    if (predicate(item))
                        result.Add(item);
                }
            }

            return result;
        }

然后在调用时将谓词传递给方法:

var myFilteredEntities = GetAll(e => e.Name == "John" && e.IsMarried == false);
于 2012-05-24T09:21:08.027 回答