Ist diese schlechte oder falsche Entwurf/Implementierung der Arbeits- und Repository -Muster (mit Transaktion) mit Petapoco

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

Frage

Ich bin neu in diesem großartigen Micro-Form-Tool (Petapoco) und frage mich, wie man Uow- und Repository-Muster mithilfe von Petapoco im Webprojekt implementiert. Ich habe einige Artikel gelesen, habe aber keine guten Ideen, wie man entwirft/implementiert wird. Könnte jemand ein Produktionsbeispiel bereitstellen oder mich anweisen, dies zu erreichen?

Hier ist mein Denk- und Pattial -Implementierungscode, bitte rat oder kommentieren Sie, ob ich falsch liege.

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

Hier ist der einfache Testfall, und es ist wahrscheinlich die Verwendung von Service -Layer -Anrufe.

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

Ich habe vor, AutoFAC als meine IOC -Lösung zu verwenden, und werde UOW -Instanz pro HTTP -Anforderung an das Repository -Objekt injizieren.

Bitte geben Sie mir einen Kommentar oder Rat, wenn dieser Code falsch oder schlecht ist. Danke vielmals.

War es hilfreich?

Lösung

Der Code ist richtig. Nur ein wenig übergeordnet imho. Eine Sache: Ich würde den Namen von ändern SaveChanges zu CommitChanges Für bessere Klarheit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top