Это плохой или неправильный дизайн/реализация единицы работы и схемы хранилища (с транзакцией) с использованием Petapoco

StackOverflow https://stackoverflow.com/questions/8305455

Вопрос

Я новичок в этом отличном инструменте Micro-Orm (Petapoco), и мне интересно, как реализовать UOW и шаблон хранилища с использованием Petapoco в веб-проекте. Я прочитал некоторые статьи, но у меня нет хороших идей, как проектировать/орудия. Может ли кто -нибудь дать какой -то пример производства или направить меня к достижению этого?

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

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

public class PetaPocoUnitOfWork : IUnitOfWork
{
    private PetaPoco.Database _db = null;

    public PetaPocoUnitOfWork(PetaPoco.Database db)
    {
        _db = db;
    }
    public void StartNew()
    {
        _db.BeginTransaction();
    }

    public void Commit()
    {
        _db.CompleteTransaction();
    }

    public void Rollback()
    {
        _db.AbortTransaction();
    }
}

public class UnitOfWorkFactory
{
    public static IUnitOfWork GetInstance()
    {
        return new PetaPocoUnitOfWork(Project.Core.Domain.ProjectDb.GetInstance());
    }
}

interface IRepository<T>
{
    void Insert(T entity);
    void Update(T entity);
    void Delete(T entity);
    List<T> FetchAll();
    List<T> FetchAll(int startIndex, int endIndex, int count);
    T Fetch(int uid);
    void SaveChanges();
}

public class TireRepository : IRepository<Tire>
{
    private IUnitOfWork _uow = null;
    public TireRepository(IUnitOfWork uow)
    {
        _uow = uow;
    }
    public void Insert(Tire entity)
    {
        var db = ProjectDb.GetInstance();
        db.Save(entity);
    }

    public void Update(Tire entity)
    {
        throw new NotImplementedException();
    }

    public void Delete(Tire entity)
    {
        var db = ProjectDb.GetInstance();
    }

    public List<Tire> FetchAll()
    {
        throw new NotImplementedException();
    }

    public List<Tire> FetchAll(int startIndex, int endIndex, int count)
    {
        throw new NotImplementedException();
    }

    public Tire Fetch(int id)
    {
        throw new NotImplementedException();
    }

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

Вот простой тестовый пример, и это, вероятно, использование вызова обслуживания.

    [TestMethod()]
    public void InsertTest()
    {
        IUnitOfWork uow = Xyz.Core.UnitOfWorkFactory.GetInstance();
        TireRepository target = new TireRepository(uow);
        Tire entity = new Tire();
        entity.Description = "ABCD";
        entity.Manufacturer = 1;
        entity.Spec = "18R/V";
        try
        {
            target.Insert(entity);
            target.SaveChanges();
        }
        catch
        {
            uow.Rollback();
        }
    }

Я планирую использовать Autofac для того, чтобы быть моим решением МОК, и буду вводить экземпляр UOW на HTTP -запрос в объект репозитория.

Пожалуйста, дайте мне комментарий или совет, если этот код неверный или плохой. Большое спасибо.

Это было полезно?

Решение

Код верен. Просто немного чрезмерно архивированный ИМХО. Одна вещь: я бы изменил имя SaveChanges к CommitChanges для лучшей ясности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top