0

我有这个注册:

 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()正确的方法还是注册有问题,应该改变?

4

1 回答 1

3

调用 ToList() 是一种正确的方法还是注册有一些问题应该改变?

不,您的注册没有任何问题。这是 Linq 的惰性求值属性。

实际上它与autofac无关。一个普通的惰性 linq 查询的行为方式与您看到的完全相同。

如果需要物化结果,需要调用ToListor ToArray。否则,将在每个枚举上评估查询(例如通过 foreach);

于 2016-02-15T06:23:09.663 回答