Interfacce complesse in un progetto multistrato

0

Nel mio progetto C # ho bisogno di scambiare i fornitori di dati in futuro, quindi ho creato interfacce per creare futuri fornitori. Ma questa è la prima volta che ho lavorato con interfacce che sono "complesse" o che hanno collezioni e sotto raccolte al loro interno.

Le mie interfacce:

public interface IPortfolio
{
    string FirstName { get; set; }
    string LastName { get; set; }
    int Id { get; set; }
    ICollection<IDocument> Documents { get; set; }
}

public interface IDocument
{
    string Name { get; set; }
    string ExtensionType { get; set; }
    int Id { get; set; }
    DateTime DateFiled { get; set; }
    int Size { get; set; }
    ICollection<IPage> Pages { get; set; }
}

public interface IPage
{
    int Id { get; set; }
    DateTime DateFiled { get; set; }
    int Size { get; set; }
}

Le mie classi derivano dalle interfacce:

public class Portfolio : IPortfolio
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Id { get; set;}
        public ICollection<IDocument> Documents { get; set; }
    }
public class Document : IDocument
    {       
        public string Name { get; set; }
        public string ExtensionType { get; set; }
        public int Id { get; set; }
        public DateTime DateFiled { get; set; }
        public int Size { get; set; }
        public ICollection<IPage> Pages { get; set; }
    }  

public class Page : IPage
    {
        public int Id { get; set; }
        public DateTime DateFiled { get; set; }
        public int Size { get; set; }
    }

Le classi basate sulle interfacce sono corrette? Qualcosa non sembra giusto per le collezioni di ogni classe. Devo implementare una sorta di iteratore?

Qualsiasi consiglio sarebbe apprezzato.

    
posta John S 04.09.2018 - 18:19
fonte

2 risposte

1

Questo non sembra giusto perché le tue interfacce dovrebbero contenere un comportamento piuttosto che proprietà.

Lascia le proprietà per le tue classi e disponi di shell dei metodi nell'interfaccia per rappresentare il comportamento

Interfaccia:

public interface IPortfolio
{
    //methods to represent behavior
    void SomeMethod();
}

public interface IDocument
{
    //methods to represent behavior
    void SomeMethod();
}

public interface IPage
{
   //methods to represent behavior
    void SomeMethod();
}

E classe:

public class Portfolio : IPortfolio
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Id { get; set;}
        public ICollection<IDocument> Documents { get; set; }
        void IPortfolio.SomeMethod
        {
        }
    }
public class Document : IDocument
    {       
        public string Name { get; set; }
        public string ExtensionType { get; set; }
        public int Id { get; set; }
        public DateTime DateFiled { get; set; }
        public int Size { get; set; }
        public ICollection<IPage> Pages { get; set; }
        void IDocument.SomeMethod
        {
        }
    }  

public class Page : Ipage
    {
        public int Id { get; set; }
        public DateTime DateFiled { get; set; }
        public int Size { get; set; }
        void Ipage.SomeMethod
        {
        }
    }

La tua interfaccia dovrebbe contenere una shell del comportamento che l'interfaccia dovrebbe implementare. In questo modo avrai metodi comuni che rappresenteranno il comportamento di ogni classe da implementare come preferisci.

Se desideri utilizzare le proprietà dell'ereditarietà, è meglio utilizzare una classe astratta per implementalo.

Modifica in calrify:

leggi questo articolo per saperne di più -
Perché usiamo la classe astratta?

    
risposta data 05.09.2018 - 09:56
fonte
0

Per DTO non hai bisogno di un'interfaccia. Avrai gli stessi oggetti DTO indipendentemente dall'archivio dati che hai.

Quello che puoi fare è aggiungere un'interfaccia al tuo livello dati. Esempio:

public interface IPortfolioDataAccess
{
  Save (Portfolio portfolio);
}

public class MySqlPortfolioDataAccess : IPortfolioDataAccess
{
  Save(Portfolio portfolio)
  {
    //Save to MySql
  }
}

public class SqlServerPorftolioDataAccess : IPortfolioDataAccess
{
  Save(Portfolio portfolio)
  {
    //Save to Sql Server
  }
}
    
risposta data 05.11.2018 - 11:41
fonte

Leggi altre domande sui tag