Autofac IE无数解析导致多个构造



我有这个注册:

 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 查询的行为方式与您看到的完全相同。

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

相关内容

  • 没有找到相关文章

最新更新