3. Using the Isolated Storage Backing Store
The previous example showed how you can use the Caching Block as a powerful in-memory caching mechanism.
However, often you will want to store the items in the cache in some
type of persistent backing store. The Caching block contains a
provider that uses Windows Isolated Storage on the local machine. This
stores data in a separate area for each user, which means that
different users will be able to see and retrieve only their own cached
data.
One point to note is that objects to be cached in any of the
physical backing stores must be serializable. The only case where this
does not apply is when you use the in-memory only (null backing store)
approach. The Product class used in
these examples contains only standard value types as its properties,
and carries the Serializable attribute.
To use isolated storage as your backing store, you simply add
the isolated storage backing store provider to your cache
manager using the configuration tools, as shown in Figure 1.
Notice that you can specify a partition name for your cache.
This allows you to separate the cached data for different applications (or different cache managers) for the same
user by effectively segregating each one in a different partition
within that user's isolated storage area.
Other than the configuration of the cache manager to use the
isolated storage backing store, the code you use to cache and retrieve
data is identical. The example, Cache data locally in the
isolated storage backing store, uses a cache manager named
IsoStorageCache Manager that is
configured with an isolated storage backing store. It retrieves a
reference to this cache manager by specifying the name when calling
the GetInstance method of the current
Enterprise Library container.
// Resolve a named CacheManager object from the container.
// In this example, this one uses the Isolated Storage Backing Store.
ICacheManager isoStorageCache
= EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>(
"IsoStorageCacheManager");
...
CacheItemsAndShowCacheContents(isoStorageCache);
The code then executes the same CacheItemsAndShowCacheContents routine you saw
in the first example, and passes to it the reference to the isoStorageCache cache manager.
Note
If you find that you get an error when you re-run
this example, it may be because the backing store provider cannot
correctly access your local isolated storage store. In most cases,
you can resolve this by deleting the previously cached contents.
Open the folder Users\
<your-user-name>\AppData\Local\IsolatedStorage, and
expand each of the subfolders until you find the Files\CachingExample
subfolder. Then delete this entire folder
tree. You should avoid deleting all of the folders in
your IsolatedStorage
folder as these may contain data used by other
applications.
4. Encrypting the Cached Data
By default, the Caching block does not encrypt the data that it
stores in memory or in a persistent backing store. However, you can configure the block to use an
encryption provider that will encrypt the data that the cache manager
stores in the backing store—but be aware that data in the in-memory
cache is never encrypted.
To use encryption, you simple add an encryption provider to the
configuration of the backing store. When you first add an encryption
provider, the configuration tool automatically adds the Cryptography
block to your configuration. Therefore, you must ensure that the
relevant assembly, Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll,
is referenced in your project.
After you add the encryption provider to the configuration of
the backing store, configure the Cryptography section by adding a new
symmetric provider, and use the Key wizard to generate a new
encryption key file or import an existing key. Then, back in the
configuration for the Caching block, select the new symmetric provider
you added for the symmetric encryption property of the backing store.
It instantiates
the cache manager defined in the configuration of the application with
the name EncryptedCacheManager:
// Resolve a CacheManager instance that encrypts the cached data.
ICacheManager encryptedCache
= EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>(
"EncryptedCacheManager");
...
CacheItemsAndShowCacheContents(encryptedCache);
The code then executes the same CacheItemsAndShowCacheContents routine you saw
in the first example, and passes to it the reference to the encryptedCache cache manager.
Note
If you find that you get an error when you run this
example, it is likely to be that you have not created a suitable
encryption key that the Cryptography block can use, or the absolute
path to the key file in the
App.config file is not correct. To
resolve this, open the configuration console, navigate to the
Symmetric Providers section of the Cryptography Application Block
Settings, and select the RijndaelManaged provider. Click the
" … " button in theKey
property to start the Cryptographic Key Wizard. Use this
wizard to generate a new key, save the key file, and automatically
update the contents ofApp.config.
5. Using the Database Backing Store
You can easily and quickly configure the Caching block to use a database as your persistent
backing store for cached data if you wish. Enterprise Library contains a
script and a command file that you can run to create the database
(located in the \Blocks\Caching\Src\Database\Scripts folder of the
Enterprise Library source code).
The scripts assume that you will use the locally installed SQL
Server Express database, but you can edit the CreateCachingDb.cmd file to change the target
to a different database server. The SQL script that the command file
executes creates a database named Caching, and adds the required tables and
stored procedures to it.
The
project contains a preconfigured database file (located in the
bin\Debug folder) that is auto-attached to your local SQL Server
Express instance. You can connect to this database using the
Microsoft® Visual Studio® Server Explorer to see the contents, as
shown in Figure 2.
To configure caching to a database, you simply add the database
cache storage provider to the cache manager using the configuration
console, and specify the connection string and ADO.NET data provider
type (the default is System.Data.SqlClient, though you can change
this if you are using a different database system).
You can also specify a partition name for your cache, in the
same way as you can for the isolated storage backing store provider.
This allows you to separate the cached data for different applications
(or different cache managers) for the same user by effectively
segregating each one in a different partition within the database
table.
Other than the configuration of the cache manager to use the
database backing store, the code you use to cache and
retrieve data is identical. The example, Cache data in a
database backing store, uses a cache manager named DatabaseCacheManager that is configured with a
data cache storage backing store. As with the earlier example, the
code retrieves a reference to this cache manager by specifying the
name when calling the GetInstance
method of the current Enterprise Library container.
// Resolve a CacheManager instance that uses a Database Backing Store.
ICacheManager databaseCache
= EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>(
"DatabaseCacheManager");
...
CacheItemsAndShowCacheContents(databaseCache);
The code then executes the same CacheItemsAndShowCacheContents routine you saw
in the first example, and passes to it the reference to the databaseCache cache manager.
Note
The connection string for the database we provide
with this example is:
Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\Caching.mdf; Integrated
Security=True; User Instance=True
If you have configured a different database using
the scripts provided with the example, you may find that you get an
error when you run this example. It is likely to be that you have an
invalid connection string in your
App.config file for your database. In
addition, use the Services applet in your Administrative Tools
folder to check that the SQL Server (SQLEXPRESS) database service
(the service is named MSSQL$SQLEXPRESS ) is
running.