Lavorare su un'applicazione DDD in cui ho bisogno di mantenere lo stato. Ecco un esempio molto semplice:
public interface IRoot {
public int Id { get; }
void UpdateValue(int value);
}
public interface IState {
int Id { get; }
int CurrentValue { get; }
}
public class AggregateRoot : IRoot {
private State _state;
internal AggregateRoot(State state){
_state = state;
}
public int Id { get { return _state.Id; } }
public void UpdateValue(int value){
_state.CurrentValue = value;
}
}
public class State : IState {
internal State(int id){
Id = id;
}
public int Id { get; internal set; }
public int CurrentValue { get; internal set; }
}
Usando l'interfaccia interna setter / getter only, posso garantire che lo stato non venga modificato al di fuori della logica di business implementata nella root del dominio. Ho creato un factory / builder all'interno dello stesso progetto per creare un'istanza di nuove radici con stato.
Il mio problema arriva quando si tratta di persistere / caricare lo stato da qualche archivio dati. Sto cercando di mantenere i dettagli di implementazione della persistenza completamente separati dal dominio, quindi creo un'interfaccia repository per mantenere lo stato:
public interface IStateRepository {
void Save(IState state);
void Delete(int key);
IState Get(int key);
}
Dal momento che sto usando le interfacce senza setter nel repository, non posso aggiornare l'ID di stato al salvataggio o popolare direttamente un oggetto. L'implementazione IStateRepository si trova in un progetto completamente separato, quindi anche id Ho cambiato repository per utilizzare direttamente lo stato, non avrei ancora accesso alle proprietà senza usare reflection.
L'unica soluzione che posso pensare che mi consentirebbe comunque di avere una separazione netta è l'implementazione di un DTO che funga da oggetto di mappatura tra il dominio e i livelli di persistenza, ma ciò non sembra corretto. In sostanza, creo un oggetto duplicato con le proprietà dell'oggetto State, ma con i setter pubblici.
Sicuramente c'è qualche schema ovvio che mi manca?