Qual è l'approccio migliore per la progettazione di questa classe astratta? (Parte 1)

StackOverflow https://stackoverflow.com/questions/1641877

  •  10-07-2019
  •  | 
  •  

Domanda

Supponiamo di avere una classe astratta chiamata: Locatario e Cliente. L'inquilino in questo caso è come il proprietario dell'applicazione per il modello di applicazione multi-tenant

Le relazioni tra queste 2 classi sono una relazione Many to One.

public abstract class Tenant
{
  protected Int32 id;
  protected String name;

  public Int32 ID { get; set; }
  public String Name { get; set; }

  public abstract bool Add();
  public abstract bool Update();
  public abstract bool Delete(); 
}

public class ApplicationTenant: Tenant
{
  public ApplicationTenant() { }

  public override Int64 ID
  {
     get { return id; }
     set { id = value; }
  }

  public override String Name
  {
     get { return name; }
     set { name= value; }
  }

  ...

}

public abstract class Customer
{
  protected Int32 id;
  protected String name;
  protected Tenant tenant;

  public Int32 ID { get; set; }
  public String Name { get; set; }
  public Tenant Tenant { get; set; }

  public abstract bool Add();
  public abstract bool Update();
  public abstract bool Delete(); 
}

public class CorporateCustomer : Customer
{
  public CorporateCustomer () { }

  public override Int64 ID
  {
     get { return id; }
     set { id = value; }
  }

  public override String Name
  {
     get { return name; }
     set { name= value; }
  }

  public override Tenant Tenant
  {
     get { return tenant; }
     set { tenant= value; }
  }


  ...

}

Il problema con questo disegno è che quando lo fai:

CorporateCustomer customer = new CorporateCustomer();
customer.Tenant.ID = xx

L'inquilino in questo caso fa sempre riferimento al locatario pubblico {get; impostato; } che in realtà è quello che voglio è quello di ApplicationTenant, NON quello astratto.

Devo rimuovere qualsiasi astrazione in questa classe Cliente se riguarda altri oggetti? Qual è il tuo pensiero?

È stato utile?

Soluzione

O usa generics nella tua classe Customer.

public abstract class Customer<TTenant> where TTenant: Tenant
{
  protected Int32 id;
  protected String name;
  protected TTenant tenant;

  public Int32 ID { get; set; }
  public String Name { get; set; }
  public TTenant Tenant { get; set; }

  public abstract bool Add();
  public abstract bool Update();
  public abstract bool Delete(); 
}

Altri suggerimenti

Vuoi dire che vuoi accedere all'implementazione concreta ApplicationTenant Properties piuttosto che ottenere semplicemente la classe astratta Tenant? Se sei sicuro che l'inquilino sia di tipo ApplicationTenant, puoi semplicemente lanciarlo, ad esempio

ApplicationTenant appTenant = (ApplicationTenant)customer.Tenant;

quindi utilizza le funzionalità di ApplicationTenant.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top