Frage

Gibt es eine mögliche Problem bei der Einrichtung Datacontext als Eigenschaft wie folgt:

Repository

public Repository()
{ 
    public DataContext dc {get;set;}

    public GetOrders(int id)
       { ...from dc.Orders...}
}

Dienstschicht:

public GetNewOrders()
   {
       ....
       Repository rep=new Repository();
       using {DataContext dc=new DataContext())
        { 
           rep.dc=dc;
           rep.GetOrders(id);
        }
    }
War es hilfreich?

Lösung

In DDD, Sie fehlt das größere Bild hier durch die concret Klassen verweisen. Sie sind nicht zwischen dem Repository und „Services layer“ durch Best Practices Schnittstelle. Wenn Sie müssen Datacontext in das Repository eingespritzt haben, würde ich empfehlen, Refactoring:

public interface IRepository
{
  IList<Orders> GetNewOrders();
}
public Repository : IRepository
{
  private IDataContext _dataContext;
  public Repository(IDataContext dataContext)
  {
    _dataContext = dataContext;
  }
  public IList<Orders> GetNewOrders()
  {
    // perform your actions on _dataContext here
  }
}

Die bessere Lösung wäre das Repository lassen Sie die Datacontext auf eigenem handhaben - die Trennung von Konzert zu halten gültig durch die zugrunde liegenden Anforderungen Maskierung:

public interface IRepository
{
  IList<Orders> GetNewOrders();
}
public Repository : IRepository
{
  private IDataContext _dataContext;
  public Repository(String connectionString)
  {
    _dataContext = new DataContext(connectionString);
  }
  public IList<Orders> GetNewOrders()
  {
    // perform your actions on _dataContext here
  }
} 

Wenn Sie die Kontrolle über die Datacontext (oder eine andere Klasse) halten müssen sich (vielleicht wollen Sie um eine statische Referenz zu halten, oder Einstellungen auf einem WebRequest Basis ändern, usw.), Sie benötigen Sie eine „Factory“ zu verwenden.

Die Fabrik würde wie folgt aussehen:

public static class DataContextFactory
{
  public static IDataContext GetInstance()
  {
    // return either a static instance, 
    // or threaded instance, a GlobalContext instance
    // or whatever your preference is here
    // 
  }
}

Auf diese Weise haben Sie die volle Kontrolle darüber, wie die Instanz von Datacontext außerhalb und weg von Ihrer „Service“ Schicht gesteuert. Also, würden Sie diese DataContextFactory wie folgt verwendet werden:

public interface IRepository
{
  IList<Orders> GetNewOrders();
}
public Repository : IRepository
{
  public IList<Orders> GetNewOrders()
  {
    using (var dataContext = DataContextFactory.GetInstance())
    {
      // dataContext is now your IDataContext to work with
    }
  }
} 

"Wie die IRepository zugreifen?" Sie können fragen?

Ihre Dienste Schicht wäre so etwas wie:

public void GetNewOrdersForServices()
{
  // Not recommended!
  //      IRepository repo = new Repository()
  //
  // The following is recommended instead; because, it removes the
  // the Concret reference from your Services layer completely!
  //
  IRepository repo = ServiceLocator.InstanceOf<IRepository>();
  IList myList = repo.GetNewOrders();

}

Oder Sie es in den Konstruktor Ihres Dienstes mit Ihrem Lieblings-Geschmack von Inversion of Control Container injizieren würde etwa so:

public class OrderService
{
  private IRepository _repo;

  public OrderService(IRepository repo)
  {
    _repo = repo;
  }

  public void GetNewOrdersForServices()
  {
    IList myList = _repo.GetNewOrders();

  }

Wenn Sie nicht mit den Service-Locator Konzepte fimilar sind Besuche Schloss Windsor, da es nur über alle Ihre Bedürfnisse kapselt.

Andere Tipps

Von dem, was ich gelesen habe, mit dem Datacontext „ für mehr als ein geschäftliches Gespräch ist in der Regel die falsche Sache zu tun.“ Blättern Sie nach unten auf die Schaltfläche Warum ist das wichtig? für das Angebot. Durch Caching und andere Faktoren, sollten Sie Ihre Datacontext altbacken sofort betrachten. Von da ist es sicher Sie die Datacontext als Eigenschaft zu halten, nicht sagen will, das von allen Methoden wiederverwendet wird. Eric Duncan Vorschlag verwenden, werden Sie in irgendeiner Art von Datacontext Fabrik passieren einen neuen Kontext für jede Abfrage zu erhalten.

Für eine Diskussion über die Datacontext konzentriert, die ADrücken Pro LINQ Buch hat eine sehr letzte Seite von denen berät Sie auch zu „halten die Datacontext altbacken sofort.“

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