2016-02-01 9 views
5

कोड नीचे इस का उपयोग कर काम करने के लिए लगता है। मैं इस कोड को बेहतर बनाने के लिए किसी भी प्रतिक्रिया की सराहना करता हूं।काम + भंडार पैटर्न के PetaPoco + इकाई

public interface IUnitOfWork : IDisposable 
{ 
    void Commit(); 
    Database Database { get; } 
} 

public interface IUnitOfWorkProvider 
{ 
    IUnitOfWork GetUnitOfWork(string connectionString); 
} 

public class PetaPocoUnitOfWorkProvider : IUnitOfWorkProvider 
{ 
    public IUnitOfWork GetUnitOfWork(string connectionString) 
    { 
     return new PetaPocoUnitOfWork(connectionString); 
    } 
} 

public interface IRepository<T> 
{ 
    void Insert(IUnitOfWork unitOfWork, T entity); 
    void Update(IUnitOfWork unitOfWork, T entity); 
    void Delete(IUnitOfWork unitOfWork, T entity); 
    T Fetch(IUnitOfWork unitOfWork, long uid); 
} 

public class PetaPocoUnitOfWork : IUnitOfWork 
{ 
    private readonly Transaction _petaTransaction; 
    private readonly Database _database; 

    public PetaPocoUnitOfWork(string connectionString) 
    { 
     _database = new Database(connectionString); 
     _petaTransaction = new Transaction(_database); 
    } 

    public void Dispose() 
    { 
     _petaTransaction.Dispose(); 
    } 

    public Database Database 
    { 
     get { return _database; } 
    } 

    public void Commit() 
    { 
     _petaTransaction.Complete(); 
    } 
} 

public class FakeRepository : IRepository<Fake> 
{ 
    public void Insert(IUnitOfWork unitOfWork, Fake entity) 
    { 
     unitOfWork.Database.Save(entity); 
    } 

    public void Update(IUnitOfWork unitOfWork, Fake entity) 
    { 
     unitOfWork.Database.Update(entity); 
    } 

    public void Delete(IUnitOfWork unitOfWork, Fake entity) 
    { 
     unitOfWork.Database.Delete(entity); 
    } 

    public FakeJobFact Fetch(IUnitOfWork unitOfWork, long uid) 
    { 
     return unitOfWork.Database.Fetch<Fake>("SELECT * FROM Fakes WHERE [FakeId] = @0", uid).FirstOrDefault(); 
    } 
} 

पुनश्च:

मैं @Plebsori वर्तमान जवाब के अनुसार कोड ढाल लिया है:

public abstract class BaseRepository<T> 
{ 
    protected IDatabase Database 
    { 
     get 
     { 
     return UnitOfWork.Current; 
     } 
    } 

    public void Insert(T entity) 
    { 
     Database.Save(entity); 
    } 

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

    public void Delete(T entity) 
    { 
     Database.Delete(entity); 
    } 
} 

public interface IRepository<T> 
{ 
    void Insert(T entity); 
    void Update(T entity); 
    void Delete(T entity); 
    T Fetch(long uid); 
} 

public interface IUnitOfWork : IDisposable 
{ 
    void Commit(); 
    Database Database { get; } 
} 

public interface IUnitOfWorkProvider 
{ 
    IUnitOfWork GetUnitOfWork(string connectionString); 
} 

public class PetaPocoUnitOfWork : IUnitOfWork 
{ 
    private readonly Transaction _petaTransaction; 
    private readonly Database _database; 

    public PetaPocoUnitOfWork(string connectionString) 
    { 
     _database = new Database(connectionString); 
     _petaTransaction = new Transaction(_database); 
    } 

    public void Dispose() 
    { 
     UnitOfWork.Current = null; 
     _petaTransaction.Dispose(); 
    } 

    public Database Database 
    { 
     get { return _database; } 
    } 

    public void Commit() 
    { 
     _petaTransaction.Complete(); 
    } 
} 

public class PetaPocoUnitOfWorkProvider : IUnitOfWorkProvider 
{ 
    public IUnitOfWork GetUnitOfWork(string connectionString) 
    { 
     if (UnitOfWork.Current != null) 
     { 
     throw new InvalidOperationException("Existing unit of work."); 
     } 

     var petaPocoUnitOfWork = new PetaPocoUnitOfWork(connectionString); 
     UnitOfWork.Current = petaPocoUnitOfWork.Database; 
     return petaPocoUnitOfWork; 
    } 
} 

public static class UnitOfWork 
{ 
    [ThreadStatic] public static IDatabase Current; 
} 
+0

आप विस्तार से बता सकता है क्या "IDatabase" इंटरफेस होना चाहिए? इसके अलावा, क्या आप इस दृष्टिकोण से खुश थे? – Mathieu

उत्तर

6

आप या पसंद नहीं हो सकता है, लेकिन यहाँ मैं कैसे काम की इकाई के निधन से हटाया है और इंटरफेस से काम की इकाई।

var unitOfWorkProvider = new PetaPocoUnitOfWorkProvider(); 
var repository = new FakeRepository(); 
var fake = new Fake 
{  
    // etc. 
}; 

using (var uow = unitOfWorkProvider.GetUnitOfWork("BlaConnectionString")) 
{ 
    repository.Insert(fake); 
    uow.Commit(); 
} 

कोड

public interface IUnitOfWorkProvider 
{ 
    IUnitOfWork GetUnitOfWork(string connectionString); 
} 

public static class UnitOfWork 
{ 
    [ThreadStatic] 
    public static IUnitOfWork Current { get; set; } 
} 

public class PetaPocoUnitOfWorkProvider : IUnitOfWorkProvider 
{ 
    public IUnitOfWork GetUnitOfWork(string connectionString) 
    { 
     if (UnitOfWork.Current != null) 
     { 
      throw new InvalidOperationException("Existing unit of work."); 
     } 
     UnitOfWork.Current = new PetaPocoUnitOfWork(connectionString); 
     return UnitOfWork.Current; 
    } 
} 

public interface IRepository<T> 
{ 
    void Insert(T entity); 
    void Update(T entity); 
    void Delete(T entity); 
    T Fetch(long uid); 
} 

public class PetaPocoUnitOfWork : IUnitOfWork 
{ 
    private readonly Transaction _petaTransaction; 
    private readonly Database _database; 

    public PetaPocoUnitOfWork(string connectionString) 
    { 
     _database = new Database(connectionString); 
     _petaTransaction = new Transaction(_database); 
    } 

    public void Dispose() 
    { 
     UnitOfWork.Current = null; 
     _petaTransaction.Dispose(); 
    } 

    public Database Database 
    { 
     get { return _database; } 
    } 

    public void Commit() 
    { 
     _petaTransaction.Complete(); 
    } 
} 

public abstract class BaseRepository<T> : IRepository<T> 
{ 
    protected IDatabase Db 
    { 
     get 
     { 
      return UnitOfWork.Current; 
     } 
    } 
} 

public class FakeRepository : BaseRepository<T> 
{ 
    public void Insert(Fake entity) 
    { 
     Db.Save(entity); 
    } 

    public void Update(Fake entity) 
    { 
     Db.Update(entity); 
    } 

    public void Delete(Fake entity) 
    { 
     Db.Delete(entity); 
    } 

    public FakeJobFact Fetch(long uid) 
    { 
     return Db.Fetch<Fake>("SELECT * FROM Fakes WHERE [FakeId] = @0", uid).FirstOrDefault(); 
    } 
} 
+0

मुझे यह धन्यवाद पसंद है। हाँ हर समय गुजरने से सही महसूस नहीं होता है। बस उत्सुक - क्या UnitOfWork.Current सुनिश्चित करता है कि रेपो केवल यूओ का उपयोग करता है जो उपयोग के दायरे का हिस्सा है? धन्यवाद! – cs0815

+1

काम की एक और इकाई मौजूद है तो फेंकने के लिए कोड उदाहरण अपडेट किया गया है। यह कामों की नेस्टेड इकाई को रोक देगा। हालांकि, स्थिर स्थिर धागा स्थिर है, इस डिज़ाइन का अर्थ यह होगा कि प्रत्येक धागे में प्रत्येक का अपना दायरा होगा। – Plebsori

+0

यदि थ्रेडस्टैटिक का उद्देश्य स्थिर है तो वर्तमान स्थिर नहीं है? – cs0815

संबंधित मुद्दे