Reputation: 711
I'm build an microservice architecture and I've found a problem on my code. A model that can be used on two or more services. For that I've created a Lib service where i keep all models (abstract) that can be use on that situation.
In every service the model has his own associations. Like on service "A" the model User has association with the Action model, on service "B" User has with Client. I can keep all mapping on the Lib Context but I'm not sure if this is the best way to do (I'm looking for something more dynamic).
What I'm trying now is having an Abstract class on the lib like AUser and on the services I inherit the model User: AUser. But on that I keep duplicating the context code on every service I use the User model.
Example:
Lib
public abstract class AUsua
{
public decimal CdUsua { get; set; }
public decimal? CdEmpr { get; set; }
public decimal? CdPerf { get; set; }
public decimal? CdUsuaRgst { get; set; }
public string DcSenha { get; set; }
public DateTime DtRgst { get; set; }
public string NmUsua { get; set; }
public string DcCpf { get; set; }
public string DcEmail { get; set; }
public string IcAtivo { get; set; }
}
AuthService
public class Usua : AUsua
{
public Usua()
{
InverseCdUsuaRgstNavigation = new HashSet<Usua>();
ModlPerf = new HashSet<ModlPerf>();
UsuaRprc = new HashSet<UsuaRprc>();
}
public virtual Perf CdPerfNavigation { get; set; }
public virtual Usua CdUsuaRgstNavigation { get; set; }
public virtual ICollection<Usua> InverseCdUsuaRgstNavigation { get; set; }
public virtual ICollection<ModlPerf> ModlPerf { get; set; }
public virtual ICollection<UsuaRprc> UsuaRprc { get; set; }
}
public class FlowAuthContext : DbContext
{
public FlowAuthContext()
{
}
public FlowAuthContext(DbContextOptions<FlowAuthContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Usua>(entity =>
{
entity.HasKey(e => e.CdEmprsModl)
.HasName("SYS_C008235");
entity.ToTable("EMPRS_MODL", "EXPERT_FLOW");
entity.HasIndex(e => e.CdEmprsModl)
.HasName("SYS_C008235")
.IsUnique();
entity.Property(e => e.CdEmprsModl)
.HasColumnName("CD_EMPRS_MODL")
.HasColumnType("NUMBER")
.ValueGeneratedOnAdd();
entity.Property(e => e.CdEmprs)
.HasColumnName("CD_EMPRS")
.HasColumnType("NUMBER");
entity.Property(e => e.CdModl)
.HasColumnName("CD_MODL")
.HasColumnType("NUMBER");
entity.Property(e => e.DtRgst)
.HasColumnName("DT_RGST")
.HasColumnType("DATE");
entity.Property(e => e.IcAtivo)
.IsRequired()
.HasColumnName("IC_ATIVO")
.HasColumnType("CHAR(2)");
});
}
}
Basically I'm looking for a way to minimize the duplicate code without using all models on the lib.
Upvotes: 0
Views: 1053
Reputation: 16498
Create a configuration class that implements IEntityTypeConfiguration<AUsua>
:
public class AUsuaConfiguration : IEntityTypeConfiguration<AUsua>
{
public void Configure(EntityTypeBuilder<AUsua> builder)
{
builder.HasKey(au => au.CdEmprsModl)
.HasName( "SYS_C008235" );
// etc.
}
}
Then apply that configuration class in OnModelCreating(ModelBuilder)
:
modelBuilder.ApplyConfiguration( new AUsuaConfiguration() );
If your derived class(es) require(s) separate configuration, you would create an inheritance hierarchy of configuration classes:
public abstract AUsuaConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : AUsua
{
public virtual void Configure(EntityTypeBuilder<AUsua> builder)
{
builder.HasKey(au => au.CdEmprsModl)
.HasName( "SYS_C008235" );
// etc.
}
}
public UsuaConfiguration : AUsuaConfiguration<Usua>
{
public override void Configure(EntityTypeBuilder<Usua> builder)
{
// configure base class properties
base.Configure(builder);
// configuration unique to `Usua` here
}
}
In OnModelCreating
:
modelBuilder.ApplyConfiguration( new UsuaConfiguration() );
Upvotes: 1