Долго думал, не смог понять зачем. IT, прокомментируешь?
Здравствуйте, AndrewVK, Вы писали:
AVK>А чем упражнения с лямбдой лучше, если просто позвать нужный код перед вызовом Dispose.Create?
Зачем вообще Dispose.Create? Можно try/finally и всех делов.
Позвать можно, только если этот код не одно одинственное выражение и он одинаков и до и после, то приходится его дублировать.
AVK>И история с вызовом одного кода сразу и при вызове диспоза — вот если бы ты про логи не сказал, я бы ни за что не догадался.
Очистка данных перед тестом, например. При отладке я могу прервать выполнение метода посередине, без вызова Dispose и тогда его нужно будет почистить перед выполнением в том числе. Могут всякие злодеи нагадить и за собой не подчистить.
Вот, например:
[Test]
public void Insert9([DataSources] string context)
{
using (var db = GetDataContext(context))
{
try
{
var id = 1001;
db.Child. Delete(c => c.ParentID > 1000);
db.Parent.Delete(p => p.ParentID > 1000);
db.Insert(new Parent { ParentID = id, Value1 = id });
Assert.AreEqual(1, db.Child.Count(c => c.ParentID == id));
}
finally
{
db.Child. Delete(c => c.ParentID > 1000);
db.Parent.Delete(p => p.ParentID > 1000);
}
}
}
теперь можно переписать
[Test]
public void Insert9([DataSources] string context)
{
using (var db = GetDataContext(context))
using (InitDispose.Create(() =>
{
db.Child.Delete(c => c.ParentID > 1000);
db.Parent.Delete(p => p.ParentID > 1000);
}))
{
var id = 1001;
db.Insert(new Parent { ParentID = id, Value1 = id });
Assert.AreEqual(1, db.Child.Count(c => c.ParentID == id));
}
}
Такой тест
[Test]
public void Test([IncludeDataSources(TestProvName.AllSybase)] string configuration)
{
using (var db = new DataConnection(configuration))
{
using (db.CreateLocalTable<TableTest1064>())
{
db.Execute("sp_configure 'allow updates', 1");
try
{
db.Execute("UPDATE syscolumns SET name = '#Column1064' where name = 'Column1064'");
db.Insert(new TableTest1064Renamed() { Column1064 = 123 });
var records = db.GetTable<TableTest1064Renamed>().ToList();
Assert.AreEqual(1, records.Count);
Assert.AreEqual(123, records[0].Column1064);
}
finally
{
db.Execute("sp_configure 'allow updates', 0");
}
}
}
}
можно переписать так
[Test]
public void Test([IncludeDataSources(TestProvName.AllSybase)] string configuration)
{
using (var db = new DataConnection(configuration))
using (db.CreateLocalTable<TableTest1064>())
using (InitDispose.Create(isInit => db.Execute("sp_configure 'allow updates', " + (isInit ? 1 : 0))))
{
db.Execute("UPDATE syscolumns SET name = '#Column1064' where name = 'Column1064'");
db.Insert(new TableTest1064Renamed() { Column1064 = 123 });
var records = db.GetTable<TableTest1064Renamed>().ToList();
Assert.AreEqual(1, records.Count);
Assert.AreEqual(123, records[0].Column1064);
}
}
Или вот такое
[Test]
public void TestQueryForBaseType([DataSources] string context)
{
var ms = SetMappings();
using (var db = GetDataContext(context, ms))
{
try
{
InsertData(db);
var data = db.GetTable<Animal>().ToList();
Assert.Null(((Dog)data.First()).Bla);
}
finally
{
CleanupData(db);
}
}
}
так
[Test]
public void TestQueryForBaseType([DataSources] string context)
{
var ms = SetMappings();
using (var db = GetDataContext(context, ms))
using (InitDispose.Create(
() => InsertData(db),
() => CleanupData(db)))
{
var data = db.GetTable<Animal>().ToList();
Assert.Null(((Dog)data.First()).Bla);
}
}
С флажками
[Test]
public void OrderBy7([DataSources] string context)
{
try
{
LinqToDB.Common.Configuration.Linq.DoNotClearOrderBys = true;
using (var db = GetDataContext(context))
{
...
var result = qry.OrderBy(x => x.ch.ChildID).Select(x => x.ch);
AreEqual(expected, result);
}
}
finally
{
LinqToDB.Common.Configuration.Linq.DoNotClearOrderBys = false;
}
}
можно обойтись так
[Test]
public void OrderBy7([DataSources] string context)
{
using (InitDispose.Create(isInit => LinqToDB.Common.Configuration.Linq.DoNotClearOrderBys = isInit))
using (var db = GetDataContext(context))
{
...
var result = qry.OrderBy(x => x.ch.ChildID).Select(x => x.ch);
AreEqual(expected, result);
}
}
AVK>Как минимум стоит добавить в Disposable, а не городить отдельный класс. А вариант с одной лямбдой надо как то переобозвать, чтобы не гадать зачем оно вообще нужно.
Да как угодно, только без слишком длинных имён. Можно перенести в Dispose и переименовать методы в WithInit/InitDispose.
Хотя по мне и так нормально.