Autofac IEnumerable解决导致多重构造

时间:2016-02-15 06:14:26

标签: c# dependency-injection autofac resolve generic-interface

我有这个注册:

 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()是正确的方法还是注册有问题需要更改?

1 个答案:

答案 0 :(得分:3)

  

调用ToList()是正确的方法还是注册有一些问题需要更改?

不,您的注册没有错。这是Linq的懒惰评价属性。

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

如果您需要具体化结果,则需要致电ToListToArray。否则,将在每个枚举上评估查询(例如,通过foreach);