Ответ 1
Вы можете улучшить время запуска (как для веб-приложений, так и для окон) путем кэширования конфигураций. Следующий класс выполнит эту работу:
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using System.Web;
using NHibernate.Cfg;
namespace NH32AutoMap.Core
{
public class ConfigurationFileCache
{
private readonly string _cacheFile;
private readonly Assembly _definitionsAssembly;
public ConfigurationFileCache(Assembly definitionsAssembly)
{
_definitionsAssembly = definitionsAssembly;
_cacheFile = "nh.cfg";
if (HttpContext.Current != null) //for the web apps
_cacheFile = HttpContext.Current.Server.MapPath(
string.Format("~/App_Data/{0}", _cacheFile)
);
}
public void DeleteCacheFile()
{
if (File.Exists(_cacheFile))
File.Delete(_cacheFile);
}
public bool IsConfigurationFileValid
{
get
{
if (!File.Exists(_cacheFile))
return false;
var configInfo = new FileInfo(_cacheFile);
var asmInfo = new FileInfo(_definitionsAssembly.Location);
if (configInfo.Length < 5 * 1024)
return false;
return configInfo.LastWriteTime >= asmInfo.LastWriteTime;
}
}
public void SaveConfigurationToFile(Configuration configuration)
{
using (var file = File.Open(_cacheFile, FileMode.Create))
{
var bf = new BinaryFormatter();
bf.Serialize(file, configuration);
}
}
public Configuration LoadConfigurationFromFile()
{
if (!IsConfigurationFileValid)
return null;
using (var file = File.Open(_cacheFile, FileMode.Open, FileAccess.Read))
{
var bf = new BinaryFormatter();
return bf.Deserialize(file) as Configuration;
}
}
}
}
Чтобы использовать это,
private Configuration readConfigFromCacheFileOrBuildIt()
{
Configuration nhConfigurationCache;
var nhCfgCache = new ConfigurationFileCache(MappingsAssembly);
var cachedCfg = nhCfgCache.LoadConfigurationFromFile();
if (cachedCfg == null)
{
nhConfigurationCache = buildConfiguration();
nhCfgCache.SaveConfigurationToFile(nhConfigurationCache);
}
else
{
nhConfigurationCache = cachedCfg;
}
return nhConfigurationCache;
}
И затем, прежде чем вызывать BuildSessionFactory, мы можем прочитать файл конфигурации из кеша или изменить сопоставления, создать его и снова кэшировать:
public ISessionFactory SetUpSessionFactory()
{
var config = readConfigFromCacheFileOrBuildIt();
var sessionFactory = config.BuildSessionFactory();
Здесь вы можете найти полный образец: (^). + Если вы хотите, чтобы он работал, отделите классы классов и сопоставлений определений отображений от основной сборки приложения (потому что класс ConfigurationFileCache удалит файл кэша, если сборка определений отображений более новая, чем файл кэша LastWriteTime).