我的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)
我应该缩小它们以获取对象参数吗?或者使用可选参数将它们保留原样?或两者兼而有之?
编辑 - 我应该说,这些参数中的每一个都映射到存储过程的参数。
答案 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);