Sto creando un'applicazione la cui architettura è basata su Architettura di Uncle Bob's Clean Architecture e DDD . Nota che è BASED su DDD, quindi mi sono dato la libertà di differire dal rigo DDD.
Per creare questa applicazione, sto usando C # con .Net Standard 2.0
Uno dei principi di DDD si riferisce a Value Objects. La definizione di oggetti valore, secondo Wikipedia è la seguente:
Value Object
An object that contains attributes but has no conceptual identity. They should be treated as immutable.
Example: When people exchange business cards, they generally do not distinguish between each unique card; they only are concerned about the information printed on the card. In this context, business cards are value object
Ora, voglio che il mio Value Objects non permetta la loro creazione se qualche convalida non ha successo. Quando succede, un'eccezione verrebbe generata durante l'istanziazione. In realtà intendevo lanciare un'eccezione, perché il nucleo dell'architettura non si aspetta che i dati non validi raggiungano quel punto.
Prima di andare oltre su questa domanda, per darti altri ragazzi, qui è la mia architettura (NOTA: ancora incompleto):
Le regole che seguo in questa architettura sono:
- Un livello può conoscere solo le interfacce del suo immediato prossimo strato più vicino
- Un livello non può sapere nulla su qualsiasi livello più esterno
- Tutte le comunicazioni tra livelli DEVONO essere eseguite tramite le interfacce
- Ogni livello deve essere distribuibile indipendentemente
- Ogni livello deve essere indipendentemente sviluppabile
Per comprendere meglio le frecce in questo diagramma, ti consiglio di leggere le domande di tali scambi dello stack:
Ora, la sfida che sto affrontando adesso è trovare un buon modo per usare i validatori. Non sono soddisfatto della mia architettura in questo punto. Il problema è il seguente:
Dal momento che posso avere migliaia di oggetti valore istanziati in un dato momento, non voglio che ogni istanza degli oggetti valore abbia un metodo di istanza per eseguire la convalida. Voglio che il metodo di validazione sia statico, poiché la sua logica sarà la stessa per ogni istanza. Inoltre, desidero che la logica di convalida sia disponibile per il livello superiore dell'architettura da utilizzare per eseguire convalide senza tentare di creare un'istanza degli oggetti valore, causando così il lancio di un'eccezione costosa.
Il problema è: C # NON CONSENTE il polimorfismo con metodi statici, quindi non posso fare qualcosa del tipo:
internal interface IValueObject<T>
{
T Value { get; }
static bool IsValid(T value);
}
Come posso ottenere questa funzionalità senza ricorrere al polimorfismo dei metodi statici e, allo stesso tempo, non sprecare memoria?