我有这个注册:
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
的类。
如果我在ToList()
上拨打result
,那么一切正常,只会被调用一次。
调用ToList()
是正确的方法还是注册有问题需要更改?
答案 0 :(得分:3)
调用ToList()是正确的方法还是注册有一些问题需要更改?
不,您的注册没有错。这是Linq的懒惰评价属性。
实际上它与autofac无关。普通的懒惰linq查询的行为与您看到的完全相同。
如果您需要具体化结果,则需要致电ToList
或ToArray
。否则,将在每个枚举上评估查询(例如,通过foreach);