Skip to content

Commit 271cabd

Browse files
Allowed the json repository to make use of the in-memory file based repository
1 parent ff55fb5 commit 271cabd

File tree

5 files changed

+39
-310
lines changed

5 files changed

+39
-310
lines changed

src/DotNetToolkit.Repository.InMemory/InMemoryRepositoryBase.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public abstract class InMemoryRepositoryBase<TEntity, TKey> : RepositoryBase<TEn
2929
/// <summary>
3030
/// Gets or sets the name of the database.
3131
/// </summary>
32-
protected string DatabaseName { get; set; }
32+
internal string DatabaseName { get; set; }
3333

3434
#endregion
3535

@@ -49,15 +49,6 @@ protected InMemoryRepositoryBase(string databaseName = null)
4949

5050
#region Protected Methods
5151

52-
/// <summary>
53-
/// Ensures the in-memory store is completely deleted.
54-
/// </summary>
55-
protected void EnsureDeleted()
56-
{
57-
_context.Clear();
58-
InMemoryCache<TEntity, TKey>.Instance.GetContext(DatabaseName).Clear();
59-
}
60-
6152
/// <summary>
6253
/// Releases unmanaged and - optionally - managed resources.
6354
/// </summary>
@@ -77,6 +68,19 @@ protected virtual void Dispose(bool disposing)
7768

7869
#endregion
7970

71+
#region Internal Methods
72+
73+
/// <summary>
74+
/// Ensures the in-memory store is completely deleted.
75+
/// </summary>
76+
internal void EnsureDeleted()
77+
{
78+
_context.Clear();
79+
InMemoryCache<TEntity, TKey>.Instance.GetContext(DatabaseName).Clear();
80+
}
81+
82+
#endregion
83+
8084
#region Private Methods
8185

8286
/// <summary>

src/DotNetToolkit.Repository.Json/DotNetToolkit.Repository.Json.csproj

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,4 @@
1818
<ProjectReference Include="..\DotNetToolkit.Repository\DotNetToolkit.Repository.csproj" />
1919
</ItemGroup>
2020

21-
<ItemGroup>
22-
<Compile Update="Properties\Resources.Designer.cs">
23-
<DesignTime>True</DesignTime>
24-
<AutoGen>True</AutoGen>
25-
<DependentUpon>Resources.resx</DependentUpon>
26-
</Compile>
27-
</ItemGroup>
28-
29-
<ItemGroup>
30-
<EmbeddedResource Update="Properties\Resources.resx">
31-
<Generator>ResXFileCodeGenerator</Generator>
32-
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
33-
</EmbeddedResource>
34-
</ItemGroup>
35-
3621
</Project>

src/DotNetToolkit.Repository.Json/JsonRepositoryBase.cs

Lines changed: 25 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -3,110 +3,57 @@
33
using InMemory;
44
using Newtonsoft.Json;
55
using Newtonsoft.Json.Serialization;
6-
using Properties;
7-
using System;
86
using System.Collections.Generic;
9-
using System.Globalization;
107
using System.IO;
118

129
/// <summary>
1310
/// Represents a repository for storing entities as an json formatted file.
1411
/// </summary>
15-
public abstract class JsonRepositoryBase<TEntity, TKey> : InMemoryRepositoryBase<TEntity, TKey> where TEntity : class
12+
public abstract class JsonRepositoryBase<TEntity, TKey> : InMemoryFileBasedRepositoryBase<TEntity, TKey> where TEntity : class
1613
{
17-
#region Fields
18-
19-
private const string FileExtension = ".json";
20-
21-
#endregion
22-
2314
#region Constructors
2415

2516
/// <summary>
2617
/// Initializes a new instance of the <see cref="JsonRepositoryBase{TEntity, TKey}"/> class.
2718
/// </summary>
2819
/// <param name="filePath">The file path.</param>
29-
protected JsonRepositoryBase(string filePath)
20+
protected JsonRepositoryBase(string filePath) : base(filePath)
3021
{
31-
if (string.IsNullOrEmpty(filePath))
32-
throw new ArgumentNullException(nameof(filePath));
33-
34-
// Ensures we have a valid file
35-
var fileName = filePath;
36-
37-
if (Directory.Exists(filePath))
38-
{
39-
if (!fileName.EndsWith(@"\"))
40-
fileName += @"\";
41-
42-
fileName += $"{GetType().Name}{FileExtension}";
43-
}
44-
else
45-
{
46-
if (string.IsNullOrEmpty(Path.GetExtension(fileName)))
47-
fileName += FileExtension;
48-
49-
if (!Path.GetExtension(fileName).Equals(FileExtension))
50-
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.InvalidFileExtension, fileName, FileExtension));
51-
52-
if (fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0)
53-
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.InvalidFilePath, fileName));
54-
}
22+
}
5523

56-
DatabaseName = fileName;
24+
#endregion
5725

58-
// Creates the file if does not exist
59-
if (!File.Exists(DatabaseName))
60-
{
61-
File.Create(DatabaseName).Dispose();
62-
}
63-
// Otherwise, try to get the data from the file
64-
else
65-
{
66-
// Adds the data from the file into memory
67-
using (var stream = new FileStream(DatabaseName, FileMode.Open, FileAccess.Read))
68-
using (var reader = new StreamReader(stream))
69-
{
70-
var serializer = new JsonSerializer();
71-
var entities = (List<TEntity>)serializer.Deserialize(reader, typeof(List<TEntity>));
26+
#region Overrides of InMemoryFileBasedRepositoryBase<TEntity,TKey>
7227

73-
EnsureDeleted();
28+
/// <summary>
29+
/// Gets the file extension.
30+
/// </summary>
31+
protected override string FileExtension { get; } = ".json";
7432

75-
entities.ForEach(AddItem);
33+
/// <summary>
34+
/// A protected overridable method for loading the entities from the specified stream reader.
35+
/// </summary>
36+
protected override IEnumerable<TEntity> OnLoaded(StreamReader reader)
37+
{
38+
var serializer = new JsonSerializer();
39+
var entities = (List<TEntity>)serializer.Deserialize(reader, typeof(List<TEntity>));
7640

77-
base.SaveChanges();
78-
}
79-
}
41+
return entities;
8042
}
8143

82-
#endregion
83-
84-
#region Overrides of InMemoryRepositoryBase<TEntity,TKey>
85-
8644
/// <summary>
87-
/// A protected overridable method for saving changes made in the current unit of work in the repository.
45+
/// A protected overridable method for saving the entities to the specified stream writer.
8846
/// </summary>
89-
protected override void SaveChanges()
47+
protected override void OnSaved(StreamWriter writer, IEnumerable<TEntity> entities)
9048
{
91-
using (var stream = new FileStream(DatabaseName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Delete))
49+
var serializer = new JsonSerializer
9250
{
93-
// Saves the data into memory
94-
base.SaveChanges();
95-
96-
// Puts from memory into the file
97-
using (var writer = new StreamWriter(stream))
98-
{
99-
var entities = GetQuery();
100-
var serializer = new JsonSerializer
101-
{
102-
Formatting = Formatting.Indented,
103-
ContractResolver = new CamelCasePropertyNamesContractResolver(),
104-
TypeNameHandling = TypeNameHandling.All
105-
};
51+
Formatting = Formatting.Indented,
52+
ContractResolver = new CamelCasePropertyNamesContractResolver(),
53+
TypeNameHandling = TypeNameHandling.All
54+
};
10655

107-
serializer.Serialize(writer, entities);
108-
}
109-
}
56+
serializer.Serialize(writer, entities);
11057
}
11158

11259
#endregion

src/DotNetToolkit.Repository.Json/Properties/Resources.Designer.cs

Lines changed: 0 additions & 81 deletions
This file was deleted.

0 commit comments

Comments
 (0)