2016-04-20 20 views
1

Ich verwende Dapper, um meine Klasse mit einer Datenzugriffsklasse aufzufüllen. In dieser Klasse mache ich alle meine CRUD-Operation.DataAccess Layer und Klasse, wo stelle ich meine Funktionen ein?

public class Product 
{ 
    public int id { get; set; } 
    public string description {get;set;} 
    public string value {get;set;} 
} 

public class ProductDa 
{ 
    //CRUD operations using Dapper 
    public List<Product> GetAllElements(); 
} 

Jetzt muss ich eine Funktion erstellen, die die Anzahl der Elemente mit einem bestimmten Wert zurückgibt.

Public int ReturnCountValue(int val) 

In dieser Funktion werde ich rufe meine GetAllElements und dann LINQ den gewünschten Wert zurückzukehren.

Was ich frage mich ist, wo sollte ich die ReturnCountValue Funktion setzen: ProductDa (die Datenzugriffsschicht) oder Product (die Basisklasse)?

Antwort

1

das Muster, das Sie verwenden gegeben, ich glaube, ein gutes mentales Modell für Sie folgende wäre:

in der Datenbank

Product stellt eine Reihe - es ist ein gutes altes C# Objekt (POCO) mit nichts besonders schlau darüber. Es sollte einfach eine Sammlung von Auto-Eigenschaften sein, genau wie in Ihrem Beispiel.

ProductDa sollte wo sein Datenzugriff auftritt. Um herauszufinden, ob Sie auf Daten zugreifen, sollten Sie sich fragen: "Soll ich die Datenbank abfragen, um diese Methode zu implementieren?" oder "werde ich Dapper verwenden, um diese Methode zu implementieren?" Wenn die Antwort Ja ist, dann geht die Interaktion mit der Datenbank in diese Klasse und ihre Methoden.

Ob Sie die Methode Count() von LINQ verwenden oder Ihre eigene zusammenstellen sollten: Auf der Datenzugriffsebene sollten Sie wahrscheinlich vermeiden, Ihre eigene Methode für Count() zu bündeln. Die Datenzugriffsebene sollte die Details der Abfrage der Datenbank abstrahieren. Weitere Manipulationen durch die Benutzer Ihrer Datenzugriffsschicht (Count, Any, First usw.) sind in Ordnung. Da Sie bereits eine List<Product> zurückgeben, haben Sie Zugriff auf die List.Count-Eigenschaft, sodass es für Anrufer einfach ist, darauf zuzugreifen.

Angesichts all das, ich würde Ihre ProductDa Klasse ändern, wie

folgt
public class ProductDa 
{ 
    //CRUD operations using Dapper 
    public List<Product> GetAllElements(); 
    //query database using Dapper to get all the elements where Value == value 
    public List<Product> GetAllElementsWithValue(int value); 
} 

und verbrauchen die Klasse wie folgt die Anzahl der Product s erhalten zurückgegeben:

var dataAccess = new ProductDa(); 
var threeValuedItems = dataAccess.GetAllElementsWithValue(3); 
int numberOfItems = threeValuedItems.Count; 

oder setzen prägnanter :

var dataAccess = new ProductDa(); 
var numberOfItemsWithValueThree = dataAccess.GetAllElementsWithValue(3).Count; 
0

Schreiben Sie keine ReturnCountValue Methode, verwenden Sie LINQ statt Ihrer Methode als Count. Ich empfehle Repository statt DAL. here

+0

Was ist, wenn ich diese LinQ viele Male verwenden muss? Ist es nicht besser, es nur an einem Ort zu haben, damit ich es auch testen kann? – SilentRage47

+0

Repository ist ein Teil von DAL also "Repository statt DAL" nicht sehr genauen Satz. Außerdem könnte ReturnCountValue eine Methode für das Repository sein. –

+0

@MaximKosov Sie haben Recht. Ich würde gerne ein "generisches" Repository erzählen. –