Est-ce mauvais ou mal la conception / mise en œuvre de l'unité de travail et modèle référentiel (avec transaction) en utilisant petapoco

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

Question

Je suis nouveau à ce grand outil micro-ORM (petapoco) et je me demande comment les outils UOW et le modèle référentiel à l'aide petapoco dans le projet web. J'ai lu quelques articles, mais ont pas de bonnes idées comment concevoir / outils. Pourrait quelqu'un fournir quelques exemples de production ou de me diriger pour y parvenir?

Voici ma pensée et le code de mise en œuvre pattial, s'il vous plaît des conseils ou un commentaire si je me trompe.

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();
    }
}

Voici le cas de test simple, et il est probablement l'utilisation de l'appel de la couche de service.

    [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();
        }
    }

Je prévois d'utiliser autoFac être ma solution et Ioc injecterez UOW instance par requête HTTP pour objet de référentiel.

S'il vous plaît me donner quelques commentaires ou des conseils si ce mauvais ou mauvais code. Un grand merci.

Était-ce utile?

La solution

Le code est bon. Juste un peu de mon humble avis sur architecturées. Une chose:. Je changerais le nom de SaveChanges à CommitChanges pour une meilleure clarté

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top