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();
}