Implementazione dell'unità di lavoro per più tipi di archiviazione

4

Sto cercando di implementare il modello dell'unità di lavoro per tipi di archiviazione più piccoli come il registro di Windows, un database o l'app.config ma non riesco a capire come farlo. Tutti gli esempi che trovo usano Entity Framework che è già un Uow, quindi non aiuta molto. Quello che vorrei memorizzare è un semplice oggetto Setting .

Dal link capisco che

A Unit of Work keeps track of everything you do during a business transaction that can affect the database. When you're done, it figures out everything that needs to be done to alter the database as a result of your work.

Quindi probabilmente dovrei iniziare con una classe che ha due proprietà settabili e una che mi dice se è sporca e ha bisogno di un aggiornamento.

class Setting
{
    private string _value;

    public Setting(string name, string value)
    {
        Name = name;
        _value = value;
    }

    public string Name { get; set; }

    public string Value
    {
        get { return _value; }
        set
        {
            _value = value;
            IsDirty = true;
        }
    }

    public bool IsDirty { get; private set; }
}

quindi suppongo di aver bisogno di un repository di base:

abstract class SettingRepository
{
    private readonly List<Setting> _settings = new List<Setting>();

    public abstract IEnumerable<Setting> Get(Setting setting);

    public void Add(IEnumerable<Setting> settings)
    {
        _settings.AddRange(settings);
    }

    public abstract int SaveChanges();
}

e un'unità di lavoro come SettingContext :

abstract class SettingContext
{
    protected SettingContext(SettingRepository settings)
    {
        Settings = settings;
    }

    public SettingRepository Settings { get; }
}

Ora non sono sicuro di dove dovrei mettere tutta la logica Update / Insert / SaveChanges? Ad esempio, un database supporta la transazione, mentre il registro di Windows non lo è.

Ho bisogno di repository differenti per ogni tipo di archiviazione o ho bisogno di contesti differenti di unità di lavoro per ognuno di essi? Sono davvero confuso.

Non so esattamente cosa dovrei fare dopo. Forse penso a molto Entity Framework e cerco di implementarlo in un modo troppo simile come questo:

using(var context = new SettingContext(new RegistryRepository()))
{
    context.Settings.Add(new Setting("Foo", "Bar")); // this should be created
    context.Settings.Add(otherSetting); // this should be updated
    context.SaveChanges();
}
    
posta t3chb0t 19.11.2016 - 09:14
fonte

1 risposta

2

Il tuo approccio va bene finora. La classe "Unità di lavoro" dovrebbe avere la responsabilità di tenere traccia delle modifiche alla "entità delle impostazioni" per una "transazione" (potrebbe farlo, ad esempio, mantenendo un elenco di comandi o oggetti modificati, se ci sarebbe più di un oggetto coinvolto) e il repository astratto dovrebbe fornire un'astrazione per le operazioni CRUD (quindi ci sarà una implementazione concreta del repository per ogni tipo di storage, va bene). L'operazione "Commit" di "UoW" quindi scorre semplicemente i comandi o gli oggetti modificati e utilizza le operazioni CRUD del repository inserito per memorizzare i dati / le modifiche.

Tuttavia, se tutti i dati che devi gestire sono contenuti in un solo oggetto impostazioni e l'operazione di aggiornamento è solo per scrivere quell'oggetto nello spazio di archiviazione in una transazione, è probabile che l'approccio "Unità di lavoro" sia eccessivo. UoW ha più senso se hai bisogno di una sorta di parentesi intorno a una transazione complessa, che coinvolge più oggetti. Per il tuo oggetto Settings , un repository con metodi come SaveSettings e LoadSettings è probabilmente sufficiente.

    
risposta data 19.11.2016 - 10:24
fonte