具有大量参数的DAL方法

时间:2012-05-24 09:10:41

标签: c# methods parameters

我的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)

我应该缩小它们以获取对象参数吗?或者使用可选参数将它们保留原样?或两者兼而有之?

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

7 个答案:

答案 0 :(得分:1)

  

我应该缩小它们以获取对象参数吗?

不一定。默认值似乎没问题(我假设您的函数可以处理null参数而没有问题)。如果您使用的是最新版本的C#,可以将此函数称为:

SearchAllProforma(institutionID: 33);

在我看来,这并不是那么糟糕。

答案 1 :(得分:1)

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

然后将该类作为参数发送。

Class SerachAllProformaParameter
{
//All Properties.
}

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

public Collection<RoIVProforma> SearchAllProforma(parameter);

答案 2 :(得分:0)

考虑到其中很多都有默认值,对于可用性 perspctive,我会使用不同数量的参数添加此方法的几个覆盖

通过这种方式,对于您的方法的消费者来说,更容易选择合适的方法,而无需在intellisense窗口中拥有眼前所有参数

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)
{
 ...
}

...

答案 3 :(得分:0)

  

我应该缩小它们以获取对象参数吗?

是的,绝对的。看着这种方法签名让我的眼睛开始流血。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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);