Что нужно знать о модуле в работе на C#

Что нужно знать о модуле в работе на C#

17 февраля 2023 г.

Шаблон проектирования "Единица работы" — это шаблон проектирования программного обеспечения, который широко используется при разработке программного обеспечения. Это способ сгруппировать операции, связанные с базой данных, в одну транзакцию или «единицу работы» для обеспечения согласованности и целостности базы данных.

В этой статье мы обсудим шаблон Unit of Work, его преимущества и способы его реализации на C#.

Предпосылки

  • Базовые знания концепций ООП.

* Любое знание языков программирования.

Цели обучения

  • Как писать код с использованием шаблона проектирования Unit of Work

Начало работы

Шаблон "Единица работы" — это способ инкапсулировать набор операций, связанных с базой данных, в одну транзакцию. Это делается для того, чтобы гарантировать, что все функции фиксируются или откатываются вместе, обеспечивая согласованность в базе данных.

Это также позволяет разработчикам группировать несколько операций, сокращая количество обращений к базе данных и повышая производительность приложения.

Преимущества шаблона «Единица работы»

Существует несколько преимуществ использования шаблона "Единица работы", в том числе:

  1. Непротиворечивость. Шаблон "Единица работы" обеспечивает одновременную фиксацию или откат всех связанных операций, обеспечивая согласованность в базе данных.

2. Производительность. Шаблон "Единица работы" сокращает количество обращений к базе данных, повышая производительность приложения.

3. Инкапсуляция. Шаблон "Единица работы" инкапсулирует операции, связанные с базой данных, что упрощает управление транзакциями базы данных.

4. Абстракция. Шаблон "Единица работы" абстрагирует уровень базы данных, упрощая изменение реализации базы данных, не затрагивая уровень приложения.

Как реализовать шаблон единицы работы в C

Мы будем использовать шаблон Repository для реализации шаблона Unit of Work в C#. Шаблон репозитория — это способ инкапсулировать уровень доступа к данным и обеспечить уровень абстракции между приложением и базой данных.

Шаг 1. Определите интерфейс единицы работы

Первым шагом является определение интерфейса единицы работы, который будет определять контракт для операций с базой данных.

public interface IUnitOfWork
{
    void Commit();
    void Rollback();
}

Шаг 2. Реализуйте единицу работы

Следующим шагом является реализация интерфейса единицы работы. В реализации мы создадим новый экземпляр DbContext для каждой единицы работы.

public class UnitOfWork : IUnitOfWork
{
    private readonly DbContext _dbContext;

    public UnitOfWork(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public void Commit()
    {
        _dbContext.SaveChanges();
    }

    public void Rollback()
    {
        // Implement rollback logic
    }
}

Шаг 3. Определите интерфейс репозитория

Следующим шагом является определение интерфейса репозитория, который будет определять контракт для операций доступа к данным.

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Remove(T entity);
    void Update(T entity);
}

Шаг 4. Внедрите репозиторий

Следующим шагом является реализация интерфейса репозитория. Мы будем использовать единицу работы для управления транзакциями базы данных в реализации.

public class Repository<T> : IRepository<T> where T : class
{
    private readonly DbSet<T> _dbSet;
    private readonly IUnitOfWork _unitOfWork;

    public Repository(DbSet<T> dbSet, IUnitOfWork unitOfWork)
    {
        _dbSet = dbSet;
        _unitOfWork = unitOfWork;
    }

    public void Add(T entity)
    {
        _dbSet.Add(entity);
    }

    public void Remove(T entity)
    {
        _dbSet.Remove(entity);
    }

    public void Update(T entity)
    {
        _dbSet.Update(entity);
    }

    public void SaveChanges()
    {
        _unitOfWork.Commit();
    }
}

Шаг 5. Использование репозитория и единицы работы в приложении

Последний шаг — использовать репозиторий и единицу работы в приложении.

Случай использования

В банковском приложении мы должны реализовать различные операции с базой данных, такие как добавление нового клиента, перевод денег с одного счета на другой и получение сведений о счете. Мы будем использовать шаблон Unit of Work, чтобы сгруппировать эти операции в одну транзакцию.

Шаг 1. Определите интерфейс единицы работы

Мы определим интерфейс Unit of Work, который определит контракт для операций с базой данных.

public interface IUnitOfWork
{
    void Commit();
    void Rollback();
    IRepository<Customer> Customers { get; }
    IRepository<Account> Accounts { get; }
    IRepository<Transaction> Transactions { get; }
}

Шаг 2. Реализуйте единицу работы

Мы реализуем интерфейс Unit of Work. В реализации мы создадим новый экземпляр DbContext для каждой единицы работы.

public class UnitOfWork : IUnitOfWork
{
    private readonly BankingDbContext _dbContext;
    private IRepository<Customer> _customers;
    private IRepository<Account> _accounts;
    private IRepository<Transaction> _transactions;

    public UnitOfWork(BankingDbContext dbContext)
    {
        _dbContext = dbContext;
    }
    public IRepository<Customer> Customers
    {
        get
        {
            if (_customers == null)
            {
                _customers = new Repository<Customer>(_dbContext.Customers, this);
            }
            return _customers;
        }
    }
    public IRepository<Account> Accounts
    {
        get
        {
            if (_accounts == null)
            {
                _accounts = new Repository<Account>(_dbContext.Accounts, this);
            }
            return _accounts;
        }
    }

    public IRepository<Transaction> Transactions
    {
        get
        {
            if (_transactions == null)
            {
                _transactions = new Repository<Transaction>(_dbContext.Transactions, this);
            }
            return _transactions;
        }
    }

    public void Commit()
    {
        _dbContext.SaveChanges();
    }

    public void Rollback()
    {
        // Implement rollback logic
    }
}

Шаг 3. Определите интерфейс репозитория

Мы определим интерфейс репозитория и договор для операций доступа к данным.

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Remove(T entity);
    void Update(T entity);
    IEnumerable<T> GetAll();
    T GetById(int id);
}

Шаг 4. Внедрите репозиторий

Мы реализуем интерфейс репозитория. Мы будем использовать единицу работы для управления транзакциями базы данных в реализации.

public class Repository<T> : IRepository<T> where T : class
{
    private readonly DbSet<T> _dbSet;
    private readonly IUnitOfWork _unitOfWork;

    public Repository(DbSet<T> dbSet, IUnitOfWork unitOfWork)
    {
        _dbSet = dbSet;
        _unitOfWork = unitOfWork;
    }
    public void Add(T entity)
    {
        _dbSet.Add(entity);
    }
    public void Remove(T entity)
    {
        _dbSet.Remove(entity);
    }
    public void Update(T entity)
    {
        _dbSet.Update(entity);
    }
    public IEnumerable<T> GetAll()
    {
        return _dbSet.ToList();
    }
    public T GetById(int id)
    {
        return _dbSet.Find(id);
    }
    public void SaveChanges()
    {
        _unitOfWork.Commit();
    }
}

Шаг 5. Использование репозитория и единицы работы в приложении

Мы будем использовать репозиторий и единицу работы приложения для выполнения различных операций с базой данных.

Например, чтобы добавить нового клиента, мы можем создать новый экземпляр класса Customer, добавить его в репозиторий Customers, а затем вызвать метод SaveChanges репозитория, чтобы зафиксировать изменения в базе данных. Вот пример фрагмента кода:

var unitOfWork = new UnitOfWork(new BankingDbContext());
var customer = new Customer
{
    FirstName = "John",
    LastName = "Doe",
    Email = "john.doe@example.com"
};
unitOfWork.Customers.Add(customer);
unitOfWork.Customers.SaveChanges();

Аналогичным образом мы можем использовать единицу работы и репозиторий для выполнения других операций с базой данных, таких как перевод денег с одной учетной записи на другую, получение сведений об учетной записи и т. д.

Используя шаблон "Единица работы", мы можем сгруппировать эти операции в одну транзакцию, гарантируя, что все операции завершатся успешно или не удастся одновременно.

Заключение

В этой статье обсуждается шаблон "Единица работы" и то, как его можно использовать в приложениях C# для управления транзакциями базы данных. Мы видели, как структура помогает сгруппировать операции с базой данных в одну транзакцию и гарантирует, что все операции будут успешными или неудачными одновременно.

Используя шаблон Unit of Work, мы можем повысить производительность и масштабируемость наших приложений, а также сделать их более надежными и надежными.

публикация C#, LinkedIn, Instagram, Twitter , Dev.to, BuyMeACoffee


Также опубликовано здесь п


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE