Я рассматриваю некоторый код из примера проекта с открытым исходным кодом проекта DDD DDD Sample.Net и наткнулся на «интересное» базовое тестовое устройство SQLite (полный код в ссылке).
Принимая во внимание, что я обычно использую строку подключения для SQLite:
"Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1")
Этот автор использует DbFile с ним (который он устанавливает / удаляет каждый тест):
"Data Source={0};Version=3;New=True;", DatabaseFile)
В чем преимущество такого подхода?
Приветствия,
Berryl
EDIT
Причина, по которой я подозреваю, что может быть преимуществомпотому что баланс кода в этом классе (ниже) предполагает, что автор не прост и не наивен.Преимущество вряд ли будет производительность.Я предполагаю, что это может сделать SQLite более надежным при выполнении тестов, но вот почему я спросил: -)
protected IDisposable Scope(bool transactional)
{
return new ScopeImpl(SessionFactory, transactional);
}
protected IDisposable Scope(bool transactional, string description)
{
Console.WriteLine(description);
return Scope(transactional);
}
private class ScopeImpl : IDisposable
{
private readonly ISessionFactory _sessionFactory;
public ScopeImpl(ISessionFactory sessionFactory, bool transactional)
{
_sessionFactory = sessionFactory;
ISession session = _sessionFactory.OpenSession();
if (transactional)
{
session.BeginTransaction();
}
CurrentSessionContext.Bind(session);
}
public void Dispose()
{
ISession session = CurrentSessionContext.Unbind(_sessionFactory);
if (!IsInExceptionContext())
{
if (session.Transaction != null)
{
session.Transaction.Commit();
session.Transaction.Dispose();
}
}
session.Close();
}
/// <summary>
/// Checks if current code is running in finally block ater throwing exception.
/// </summary>
private static Boolean IsInExceptionContext()
{
return Marshal.GetExceptionPointers() != IntPtr.Zero || Marshal.GetExceptionCode() != 0;
}