Как объединить похожие вызовы методов в шаблон делегата? - PullRequest
3 голосов
/ 01 мая 2010

У меня есть три метода:

public void Save<T>(T entity)
{
    using (new Transaction())
    {
        Session.Save(entity);
    }
}

public void Create<T>(T entity)
{
    using (new Transaction())
    {
        Session.Create(entity);
    }
}

public void Delete<T>(T entity)
{
    using (new Transaction())
    {
        Session.Delete(entity);
    }
}

Как видите, единственное, что отличается, - это вызов метода внутри блока using. Как я могу переписать это так, что-то вроде этого:

public void Save<T>(T entity)
{
    TransactionWrapper(Session.Save(entity));
}

public void Create<T>(T entity)
{
    TransactionWrapper(Session.Create(entity));
}

public void Save<T>(T entity)
{
    TransactionWrapper(Session.Save(entity));
}

Другими словами, я передаю вызов метода в качестве параметра, а метод TransactionWrapper оборачивает транзакцию вокруг вызова метода.

1 Ответ

4 голосов
/ 01 мая 2010

Вы можете передать Действие методу, чтобы указать действие для выполнения:

private void ExecuteInTransaction<T>(Action<T> action, T entity)
{
    using (new Transaction())
    {
        action(entity);
    }
}

public void Save<T>(T entity)
{
    ExecuteInTransaction(Session.Save, entity);
}

Но IMO, это не достойное улучшение по сравнению с вашим исходным кодом, если ваш ExecuteInTransaction метод не более сложен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...