-
Notifications
You must be signed in to change notification settings - Fork 160
Expand file tree
/
Copy pathAzureBlobRepositoryBase.cs
More file actions
112 lines (90 loc) · 3.33 KB
/
Copy pathAzureBlobRepositoryBase.cs
File metadata and controls
112 lines (90 loc) · 3.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Linq;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using Newtonsoft.Json;
using SharpRepository.Repository;
using SharpRepository.Repository.Caching;
using SharpRepository.Repository.FetchStrategies;
namespace SharpRepository.AzureBlobRepository
{
public class AzureBlobRepositoryBase<T, TKey> : LinqRepositoryBase<T, TKey> where T: class, new()
{
protected CloudBlobClient BlobClient { get; private set; }
protected CloudBlobContainer BlobContainer { get; private set; }
protected string ContainerName { get; private set; }
protected bool CreateIfNotExists { get; private set; }
internal AzureBlobRepositoryBase(string connectionString, string containerName, bool createIfNotExists,
ICachingStrategy<T, TKey> cachingStrategy = null)
: base(cachingStrategy)
{
var storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(connectionString);
ContainerName = TypeName.ToLower();
if (!String.IsNullOrEmpty(containerName))
{
ContainerName = containerName;
}
CreateIfNotExists = createIfNotExists;
BlobClient = storageAccount.CreateCloudBlobClient();
SetContainer();
}
protected void SetContainer()
{
BlobContainer = BlobClient.GetContainerReference(ContainerName);
if (CreateIfNotExists)
{
BlobContainer.CreateIfNotExistsAsync();
}
}
protected override T GetQuery(TKey key, IFetchStrategy<T> fetchStrategy)
{
try
{
var blob = BlobContainer.GetBlockBlobReference(key.ToString());
return blob == null ? null : JsonConvert.DeserializeObject<T>(blob.DownloadTextAsync().Result);
}
catch (StorageException storageException)
{
// check for 404 and return null in that case only, let others bubble up
if (storageException.RequestInformation.HttpStatusCode == 404)
{
return null;
}
throw;
}
}
protected override IQueryable<T> BaseQuery(IFetchStrategy<T> fetchStrategy = null)
{
throw new NotImplementedException();
}
protected virtual CloudBlockBlob GetBlobReference(T entity)
{
GetPrimaryKey(entity, out TKey key);
return BlobContainer.GetBlockBlobReference(key.ToString());
}
protected override void AddItem(T entity)
{
AddOrUpdateItem(entity);
}
protected override void DeleteItem(T entity)
{
var blob = GetBlobReference(entity);
blob.DeleteIfExistsAsync();
}
protected override void UpdateItem(T entity)
{
AddOrUpdateItem(entity);
}
protected virtual void AddOrUpdateItem(T entity)
{
var blob = GetBlobReference(entity);
blob.UploadTextAsync(JsonConvert.SerializeObject(entity));
}
protected override void SaveChanges()
{
}
public override void Dispose()
{
}
}
}