InitDispose
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.04.19 19:14
Оценка:
Долго думал, не смог понять зачем. IT, прокомментируешь?
AVK Blog
Re: InitDispose
От: IT Россия linq2db.com
Дата: 08.04.19 15:22
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Долго думал, не смог понять зачем. IT, прокомментируешь?


Нужен код, который выполнится в начале и гарантированно в конце блока. Лично мне нужно для тестов и логов. Зачистить данные перед тестом и по завершении. Установить/сбросить флаг на время теста. Засечь время выполнения блока.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: InitDispose
От: MozgC США http://nightcoder.livejournal.com
Дата: 08.04.19 16:05
Оценка:
Здравствуйте, IT, Вы писали:

IT>Нужен код, который выполнится в начале и гарантированно в конце блока. Лично мне нужно для тестов и логов. Зачистить данные перед тестом и по завершении. Установить/сбросить флаг на время теста. Засечь время выполнения блока.


+1. Мне такое нередко нужно.
Re[2]: InitDispose
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.04.19 16:40
Оценка:
Здравствуйте, IT, Вы писали:

AVK>>Долго думал, не смог понять зачем. IT, прокомментируешь?

IT>Нужен код, который выполнится в начале и гарантированно в конце блока.

А чем упражнения с лямбдой лучше, если просто позвать нужный код перед вызовом Dispose.Create?
И история с вызовом одного кода сразу и при вызове диспоза — вот если бы ты про логи не сказал, я бы ни за что не догадался.

IT> Лично мне нужно для тестов и логов. Зачистить данные перед тестом и по завершении. Установить/сбросить флаг на время теста. Засечь время выполнения блока.


Как минимум стоит добавить в Disposable, а не городить отдельный класс. А вариант с одной лямбдой надо как то переобозвать, чтобы не гадать зачем оно вообще нужно.
AVK Blog
Отредактировано 08.04.2019 16:40 AndrewVK . Предыдущая версия .
Re[3]: InitDispose
От: IT Россия linq2db.com
Дата: 09.04.19 00:02
Оценка:
Здравствуйте, 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.

Хотя по мне и так нормально.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.