我有这个注册:
builder.RegisterAssemblyTypes(assembly)
.AsClosedTypesOf(typeof(IBusinessRule<>))
.AsImplementedInterfaces()
.SingleInstance();
我这样解决它:
using (var scope = Container.BeginLifetimeScope())
{
var rules = Container.Resolve<IEnumerable<IBusinessRule<T>>>();
var result = rules.Select(x => x.IsValid(t));
if (result.Any(x => !x.Successful))
{
var msg = string.Join(Environment.NewLine, result.Where(x => !x.Successful).Select(x => x.Message));
return new OperationResultBase()
{
Message = msg,
Successful = false,
Operation = System.Reflection.MethodBase.GetCurrentMethod().Name
};
}
else
{
return new OperationResultBase(true);
}
}
问题出在这一行:
var result = rules.Select(x => x.IsValid(t));
通过该解析,实现IBusinessRule<T>
的类将为每个result
变量枚举调用一次。
如果我在result
上调用ToList()
,那么一切都很好,只会被调用一次。
调用ToList()
是正确的方法,还是注册存在一些问题,应该更改?
调用 ToList(( 是正确的方法还是注册存在一些问题,应该更改?
不,您的注册没有错。这是 Linq 的惰性求值属性。
事实上,它与自拍无关。正常的惰性 linq 查询的行为方式与您看到的完全相同。
如果需要物化结果,则需要调用ToList
或ToArray
。否则,将在每次枚举上评估查询(例如通过foreach(;