Parece haber muchos ejemplos sobre la implementación del patrón Repository para Linux a SQL. La mayoría de ellos presenta IRepository y DI; Algunos han implementado la Unidad de Trabajo y otros no. Traté de leer como la mayoría de los resultados devueltos por las búsquedas en SO y Google en Linq a los patrones de repositorio SQL. Sin embargo, aún no he encontrado una solución completa.Patrón de repositorio con Linq a SQL usando IoC, Inyección de dependencia, Unidad de trabajo
De mis lecturas he implementado un modelo de repositorio, como se muestra a continuación:
estoy usando DI registrar interfaces en las que se dependían los repositorios:
this.container.RegisterType<IConnectionStringFactory, ConnectionStringFactory>(new ContainerControlledLifetimeManager(),
new InjectionConstructor(connectionString));
this.container.RegisterType<IDataContextFactory, DataContextFactory>();
Implementación patrón de repositorio:
public interface IPrivilegeRepository : IRepository<PrivilegesEntity>
{
IList<MenuModel> GetRootMenu();
IList<MenuModel> GetChildMenu(int parentId);
}
public class PrivilegeRepository : Repository<PrivilegesEntity>, IPrivilegeRepository
{
#region IPrivilegeRepository Members
public IList<MenuModel> GetRootMenu()
{
return FindAll(menu => menu.ParentId == null)
.OrderBy(menu => menu.SortOrder)
.Select(c => EntityMapper.Privileges.ToBusinessObject(c))
.ToList();
}
public IList<MenuModel> GetChildMenu(int parentId)
{
return FindAll(menu => menu.ParentId == parentId)
.OrderBy(menu => menu.SortOrder)
.Select(menu => EntityMapper.Privileges.ToBusinessObject(menu))
.ToList();
}
#endregion
public PrivilegeRepository(IDataContextFactory dataContextFactory)
: base(dataContextFactory)
{
}
}
IRepository interfaz genérica:
public interface IRepository<T> where T : class
{
IEnumerable<T> All();
IEnumerable<T> FindAll(Expression<Func<T, bool>> exp);
T Single(Expression<Func<T, bool>> exp);
T First(Expression<Func<T, bool>> exp);
}
clase Repositorio se implementa como a continuación con implementaciones de IRepository (no mostrado) y está teniendo una dependencia en IDataContextFactory que DI es cuidar de:
public class Repository<T> : IRepository<T> where T : class
{
public Repository(IDataContextFactory dataContextFactory)
{
this.dataContextFactory = dataContextFactory;
}
}
Repositories se consumen utilizando COI:
PrivilegeRepository repository = container.Resolve<PrivilegeRepository>();
estoy volviendo resultado de las consultas como una colección de objetos de negocios con el fin de evitar la dependencia de Lin q a SQL en capas de aplicaciones donde consumo repositorio. El escenario anterior funciona bien con mi aplicación WPF que está usando el patrón MVVM. Tengo ViewModel aks Clases de presentador que no dependen de las clases generadas por Linq-SQL.
¿Cómo extiendo este patrón para poder guardar datos en la base de datos? Me gustaría pasar Business Objects de vuelta al repositorio y obtenerlos guardados. ¿Es posible? ¿Cómo puedo implementar la Unidad de trabajo en tal escenario?
Es posible que desee mirar el patrón de registro activo; cubre operaciones CRUD completas junto con una capacidad de consulta de acceso similar a un repositorio. –
¿Qué pasa con Entity Framework enviado con VS2010? – Raj
@Raj Creo que te perdiste el hecho de que quiere ser ORM independiente. – Novus