これは、Petapocoを使用した作業およびリポジトリパターン(トランザクション付き)のユニットのデザイン/実装が悪いか間違っていますか
-
25-10-2019 - |
質問
私はこの素晴らしいマイクロオームツール(Petapoco)を初めて使用しています。WebプロジェクトでPetapocoを使用してUOWとリポジトリパターンを実装する方法を疑問に思います。私はいくつかの記事を読んでいますが、設計/実装方法の良いアイデアはありません。誰かがいくつかの生産例を提供したり、これを達成するために私に指示することができますか?
これが私の思考とパティアルの実装コードです。私が間違っている場合はアドバイスまたはコメントしてください。
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を使用してIOCソリューションになる予定で、HTTPリクエストごとにリポジトリオブジェクトにUOWインスタンスを注入する予定です。
このコードが間違っているか悪い場合は、コメントやアドバイスをください。どうもありがとう。
解決
コードは正しいです。ほんの少し描写されていないiMho。一つのこと:名前を変更します SaveChanges
に CommitChanges
明確にするために。
所属していません StackOverflow