예제 #1
0
        private InstantiationBinding UpdateConstructorBindings(
            IConventionEntityType entityType,
            Type proxyType,
            InstantiationBinding binding)
        {
            if (_options?.UseLazyLoadingProxies == true)
            {
                foreach (var conflictingProperty in entityType.GetDerivedTypes()
                         .SelectMany(e => e.GetDeclaredServiceProperties().Where(p => p.ClrType == typeof(ILazyLoader)))
                         .ToList())
                {
                    conflictingProperty.DeclaringEntityType.RemoveServiceProperty(conflictingProperty.Name);
                }

                var serviceProperty = entityType.GetServiceProperties()
                                      .FirstOrDefault(e => e.ClrType == typeof(ILazyLoader));
                if (serviceProperty == null)
                {
                    serviceProperty = entityType.AddServiceProperty(_lazyLoaderProperty);
                    serviceProperty.SetParameterBinding(
                        (ServiceParameterBinding) new LazyLoaderParameterBindingFactory(
                            _lazyLoaderParameterBindingFactoryDependencies)
                        .Bind(
                            entityType,
                            typeof(ILazyLoader),
                            nameof(IProxyLazyLoader.LazyLoader)));
                }

                return(new FactoryMethodBinding(
                           _proxyFactory,
                           _createLazyLoadingProxyMethod,
                           new List <ParameterBinding>
                {
                    new ContextParameterBinding(typeof(DbContext)),
                    new EntityTypeParameterBinding(),
                    new DependencyInjectionParameterBinding(
                        typeof(ILazyLoader), typeof(ILazyLoader), new[] { (IPropertyBase)serviceProperty }),
                    new ObjectArrayParameterBinding(binding.ParameterBindings)
                },
                           proxyType));
            }

            return(new FactoryMethodBinding(
                       _proxyFactory,
                       _createProxyMethod,
                       new List <ParameterBinding>
            {
                new ContextParameterBinding(typeof(DbContext)),
                new EntityTypeParameterBinding(),
                new ObjectArrayParameterBinding(binding.ParameterBindings)
            },
                       proxyType));
        }