specification pattern net framework driven domain c# .net design-patterns linq-to-sql domain-driven-design

c# - net - repository pattern entity framework



¿Cómo implementar el método Repository FindAll()? (1)

Un enfoque simple es simplemente crear la consulta a mano:

public class SearchCriteria { public string Name { get; set; } // ...more } public IEnumerable<Entity> FindAll(SearchCriteria criteria) { IQueryable<Entity> entities = _datasource.Entities; // replace with your L2S equivalent if (criteria.Name != null) entities = entities.Where(e => e.Name == criteria.Name); // ...more return entities; }

Si no desea devolver los objetos generados directamente, asigne un mapa a otra cosa antes de regresar:

return Map(entities); // IEnumerable<CustomObject> Map(IEnumerable<Entity> entities)

Tengo el siguiente patrón de repositorio. El requisito es "Buscar todas las cuentas cuyo nombre de propietario sea Lijo". Entonces, necesito escribir una función FindAll. Cómo escribir esta función?

Las restricciones son:

1) El cliente "BankAccountService" no debe usar clases de ''DBML_Project''.

2) NO debemos usar el método GetAll para retirar una lista completa de cuentas y luego hacer un filtro.

Nota: Me enfrenté a este problema mientras trabajaba en la pregunta Polimorfismo: ¿La entidad ORM es una Entidad de Dominio o una Entidad de Datos?

CÓDIGO

namespace ApplicationService_Bank { public class BankAccountService { RepositoryLayer.ILijosBankRepository accountRepository = new RepositoryLayer.LijosSimpleBankRepository(); public void FreezeAllAccountsForUser(string userName) { //Should not use assembly ''DBML_Project''. IEnumerable<DomainEntitiesForBank.IBankAccount> accountsForUserWithNameLIJO = null; //accountsForUserWithNameLIJO = accountRepository.FindAll(p => p.BankUser.Name == "Lijo"); } } } namespace RepositoryLayer { public interface ILijosBankRepository { List<DomainEntitiesForBank.IBankAccount> GetAll(); IEnumerable<DBML_Project.BankAccount> FindAll(System.Func<DBML_Project.BankAccount, bool> predicate); void SubmitChanges(); } public class LijosSimpleBankRepository : ILijosBankRepository { private IBankAccountFactory bankFactory = new MySimpleBankAccountFactory(); public System.Data.Linq.DataContext Context { get; set; } public virtual List<DomainEntitiesForBank.IBankAccount> GetAll() { List<DBML_Project.BankAccount> allItems = Context.GetTable<DBML_Project.BankAccount>().ToList(); List<DomainEntitiesForBank.IBankAccount> bankAccounts = new List<DomainEntitiesForBank.IBankAccount>(); foreach (DBML_Project.BankAccount acc in allItems) { DomainEntitiesForBank.IBankAccount theAccount = bankFactory.CreateAccount(acc.AccountType, acc.BankAccountID, acc.Status, acc.OpenedDate, acc.AccountOwnerID); bankAccounts.Add(theAccount); } return bankAccounts; } public IEnumerable<DBML_Project.BankAccount> FindAll(System.Func<DBML_Project.BankAccount, bool> predicate) { //Where var results = Context.GetTable<DBML_Project.BankAccount>().Where(predicate); return results; } public virtual void SubmitChanges() { Context.SubmitChanges(); } } }

LEYENDO:

  1. Devolver IEnumerable <T> frente a IQueryable <T>

  2. cómo diseñar un patrón de repositorio para que sea fácil cambiar a otro ORM más tarde?