2010-04-13 4 views
0

Mon respository actuelle est la suivante, s'il vous plaît suggérer, je suis actuellement en utilisant contexte LINQ2SQL données par insertion/delele/mise à jourLINQ2SQL dataLayer/Repository Suggestion

namespace Lib.Repository 
{ 

    public class MotorRenewalDataRepository 
    { 
     public MotorRenewalDataRepository()   
     { 

     } 
     public MotorRenewalData GetByID(long id) 
     { 
      using(var _context=DatabaseFactory.Create(false)) 
      { 
       return _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == id).FirstOrDefault(); 
      } 
     } 
     public MotorRenewalData Insert(MotorRenewalData entity) 
     { 
      using (var _context = DatabaseFactory.Create(false)) 
      { 
       _context.MotorRenewalDatas.InsertOnSubmit(entity); 
       _context.SubmitChanges(); 
       return entity; 
      } 
     } 
     public void Update(MotorRenewalData entity) 
     { 
      using (var _context = DatabaseFactory.Create(true)) 
      { 
       var dbEntity = _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == entity.MotorRenewalDataID) 
          .FirstOrDefault();     
       Common.CopyObject<MotorRenewalData>(entity, dbEntity); 
       _context.SubmitChanges(); 

      } 

     } 

    } 
} 
+0

Quel est le problème? – SteadyEddi

Répondre

0

Si je comprends bien votre question, vous cherchez des suggestions sur comment implémenter correctement le modèle de référentiel. Voici une bonne pratique d'utilisation du modèle de référentiel. D'abord vous voudrez créer une interface pour votre dépôt. C'est ici que vous définissez ce qu'un référentiel peut faire.

public interface IRepository<T> 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    void Save(); 
    IQueryable<T> FindAll(); 
} 

Ensuite, vous pouvez créer les référentiels individuels. La première chose que vous voulez faire ici est de créer une interface pour tout ce qui est en dehors d'un dépôt normal que vous pourriez faire.

public interface IMotorRenewalRepository : IRepository<MotorRenewal> 
{ 
    MotorRenewal FindMotorRenewalById(int id); 
} 

Et cette interface mettra en œuvre la IRepository de MotorRenewal afin que vous obtenez tout de la IRepository et tout ce que vous définissez dans IMotorRenewalRepository. L'interface est le plus souvent utilisée lorsque vous utilisez une sorte d'injection de dépendance lors de l'écriture de faux objets et de tests unitaires pour votre référentiel.

Maintenant, écrivez votre MotorRenewalRepository et implémentez le IMotorRenewalRepository.

public class MotorRenewalRepository : IMotorRenewalRepository 
{ 
    MyDataContext _dataContext = new MyDataContext(); 

    public void Add(MotorRenewal motorRenewal) 
    { 
     _dataContext.MotorRenewals.InsertOnSubmit(motorRenewal); 
    } 

    public void Delete(MotorRenewal motorRenewal) 
    { 
     _dataContext.MotorRenewals.DeleteOnSubmit(motorRenewal); 
    } 

    public void Save() 
    { 
     _dataContext.SubmitChanges(); 
    } 

    public IQueryable<MotorRenewal> FindAll() 
    { 
     return _dataContext.MotorRenewals.AsQueryable(); 
    } 

    public User FindMotorRenewalById(int id) 
    { 
     return _dataContext.MotorRenewals.Where(p => p.MotorRenewalDataID == id).SingleOrDefault(); 
    } 
} 

Cette implémentation est beaucoup plus facile à comprendre. Notez que vous n'avez pas besoin de mise à jour. Une mise à jour consiste simplement à retirer un objet MotorRenewal du référentiel, à le modifier et à appeler .Save().

Vous pouvez utiliser une variable de niveau classe pour votre contexte de données plutôt que d'en créer une nouvelle chaque fois que vous appelez une méthode dans votre référentiel. MyDataContext doit provenir du modèle que vous avez créé lorsque vous faites glisser vos classes LinqToSql à partir de votre connexion de données.

+0

@MindlessProgrammer En ce qui concerne la suggestion de swhook sur la réutilisation de DataContext, voir l'article de Rick Strahl sur la gestion de la durée de vie de DataContext: http://www.west-wind.com/weblog/posts/246222.aspx. Je reconnais que nous supposons que vous créez un nouveau 'DataContext', mais que vous pouvez en fait renvoyer une instance mise en cache. Si c'est le cas, je suggérerais seulement de renommer la méthode 'Create()' en quelque chose comme 'Get()' pour rendre la sémantique plus précise. – Jay

+0

@swhook @Jay Je connais la création d'interface et d'implémentation, je m'en fous, j'ai juste besoin d'un code utilisable structuré. La chose que je veux vraiment savoir est DatabaseFactory.Create (useObjectTracking) est en train de récupérer une nouvelle instance de datacontext, je sais que je peux créer un datacontext et simplement surpasser l'entité puis appeler les changements de soumission, normalement avec le suivi d'objet par webservices, Web Apps, applications Winform mutlithreaded, je rencontre généralement des problèmes avec le suivi des objets, donc je fais sans suivi d'objet, Est-ce une bonne pratique? – MindlessProgrammer