I miss ILazyloader (EF Core )after use Activator.CreateInstance() for create Entity

121 Views Asked by At

I use Activator.CreateInstance() like below

 public class EntityBase
    {
        public EntityBase()
        {

        }

        private readonly IServiceProvider serviceProvider;
        public EntityBase(IServiceProvider serviceProvider)
        {
            this.serviceProvider = serviceProvider;
        }
    Type propertyType = GetPropertyType("ORMLawEntity");
    Type type = propertyType.GetGenericArguments().Single();
    object obj = Activator.CreateInstance(type);
}

to create the below Entity:

 public class ORMLawEntity : EntityBase
    {
     private readonly ILazyLoader _lazyLoader;
            [JsonConstructor]
            public ORMLawEntity()
            {
                base.PrimaryKey = "idLaw";
                base.EntityName = "Law";
            }
            public ORMLawEntity(ILazyLoader lazyLoader)
            {
                base.PrimaryKey = "idLaw";
                base.EntityName = "Law";
                _lazyLoader = lazyLoader;
            }
        [Key]
        public long idLaw { set; get; }

    private ORMCatalogValueEntity _LawTypeCIDEntity;
    
    public virtual ORMCatalogValueEntity LawTypeCIDEntity
            {
              set { _LawTypeCIDEntity = value; } 
              get {  
                    return _lazyLoader.Load(this, ref _LawTypeCIDEntity);
                  }
            }
    }

but when I use Activator.CreateInstance(type) default constructor executed and I don't have lazyloader. but I want to fill lazyLoader for LawTypeCIDEntity property.

1

There are 1 best solutions below

7
Hervé On

Add the params inside the CreateInstance method. The appropriate constructor will implicitly be resolved.

Activator.CreateInstance(type, someLazyLoader);

If you want to inject it from a DI container

public class EntityBase
{
    private readonly ILazyLoader lazyLoader;
    
    public EntityBase()
    {
    }

    public EntityBase(ILazyLoader lazyLoader)
    {
        this.lazyLoader = lazyLoader;
    }

    public ORMLawEntity CreateORMLawEntity()
    {
        return (ORMLawEntity) Activator.CreateInstance(type, lazyLoader);
    }
}