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>ごとに 1 回呼び出されます。result

を呼び出すToList()result、すべて問題なく、1 回だけ呼び出されます。

ToList()正しいアプローチを呼び出していますか、それとも登録に問題があり、変更する必要がありますか?

4

1 に答える 1

3

ToList() の呼び出しは正しいアプローチですか、それとも登録に問題があり、変更する必要がありますか?

いいえ、登録に問題はありません。これは、Linq の遅延評価プロパティです。

実際、autofac とは何の関係もありません。通常の遅延 linq クエリは、ご覧のようにまったく同じように動作します。

実体化された結果が必要な場合は、ToListまたはを呼び出す必要がありますToArray。それ以外の場合、クエリは列挙ごとに評価されます (たとえば、foreach を介して)。

于 2016-02-15T06:23:09.663 に答える