Je développe une application n-tier et j'ai décidé d'utiliser le Repository Pattern dans Data Access Layer mais je ne veux utiliser aucun ORM (va utiliser ADO .net)Conception de la couche d'accès aux données en utilisant Repository sans utiliser Entity Framework
Je ne suis pas capable de décider comment récupérer les données dans le référentiel où il y a une relation entre 2 entites (pas de relation parent-enfant). Par exemple. J'ai la table de commande et de client. Il y a une colonne "CustomerID" dans la table "Order" qui est liée à la table "Customer".
- Comment récupérer les informations du client pendant que je suis aller chercher Commandes
information (simple ou multiple) basé sur OrderID? - Pouvons-nous utiliser create instance d'un dépôt dans un autre?
Voici la structure de code actuelle.
///////////// Abstract Class for Common Functionality////
public abstract class BaseRepository<T> where T : class
{
private static SqlConnection sqlConnection;
protected string DatabaseName { get; set; }
protected string ConnectionString;
public delegate T CallBack(SqlDataReader reader);
public BaseRepository()
{
ConnectionString = Convert.ToString(ConfigurationManager.ConnectionStrings["TestDB"]);
sqlConnection = new SqlConnection(ConnectionString);
}
protected abstract T PopulateRecord(SqlDataReader reader);
protected IEnumerable<T> GetRecords(SqlCommand command)
{
var list = new List<T>();
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
command.Connection = connection;
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader != null)
{
while (reader.Read())
{
list.Add(PopulateRecord(reader));
}
}
} // reader closed and disposed up here
} //connection closed and disposed here
return list;
}
}
////////////////// Repository Class //////////////////////////
public class OrderRepository : BaseRepository<Order>, IRepository<Order>
{
protected override Order PopulateRecord(SqlDataReader reader)
{
return new Order
{
OrderID = reader.GetIntVal("OrderID"),
OrderDate = reader.GetDateTimeVal("OrderDate"),
ProductInfo= // How to Populate Product Information which is in another repository
CustomerInfo = // How to Populate Customer Information which is in another repository
};
}
public IEnumerable<Order> GetAll()
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "GetOrders";
cmd.CommandType = CommandType.StoredProcedure;
return GetRecords(cmd);
}
}
/////////////// Entity Class ////////////////////
public class Order {
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public Customer ProductInfo { get; set; }
public Product CustomerInfo { get; set; }
}
public class Customer {
public int CustomerID { get; set; }
public string CustomerName { get; set; }
}
public class Product {
public int ProductID { get; set; }
public string ProductName { get; set; }
}
Que voulez-vous utiliser au lieu de "n'importe quel ORM"? appliquer les bonnes étiquettes. Post (parties de) le code en ligne dans la question, ces liens disparaissent après un certain temps. –
Oui; il est possible de mettre en œuvre une telle conception SANS utiliser d'ORM. Mais ce sera beaucoup de travail et vous ferez enfin ce que les autres ORM ont fait. Je recommande s'il vous plaît ne pas réinventer la roue. Envisagez d'utiliser un micro-ORM léger comme Dapper. –
@AmitJoshi Je ne suis pas en train de repenser un ORM. Sur le backend j'écris la procédure stockée pour des opérations de CRUD. Je veux améliorer ma structure de code actuelle en suivant les principes de conception. –