6

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:

repository pattern

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?

+0

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. –

+0

¿Qué pasa con Entity Framework enviado con VS2010? – Raj

+0

@Raj Creo que te perdiste el hecho de que quiere ser ORM independiente. – Novus

Respuesta

1

Bueno, este es un problema que he visto muchas veces. Desea desacoplar sus objetos comerciales de su estrategia de almacenamiento de datos. Al realizar una proyección a sus objetos de negocio, pierde muchas de las características interesantes de tener un repositorio (podría devolver IQueryable, por ejemplo, haciendo uso de ejecución diferida). La única forma en que puede implementar esto es dando a su Repositorio una dependencia hacia un IMapper<BusinessObject> por ejemplo. De esta forma, puede asignar su objeto comercial al objeto que su repositorio necesita para almacenar algo, pero dejando la abstracción en su lugar, ya que sus objetos comerciales permanecen ignorantes por la persistencia.

5

Here is an answer of mine to a similar question.

La idea básica es que los genéricos repositorio de interfaces de no funcionan tan bien, pero repositorio genérico implementaciones trabajo grande. Utiliza LINQ to SQL como el ejemplo de ORM y debe proporcionar una idea de su pregunta.

Asegúrese de leer también la respuesta de Paul, especialmente los comentarios.

Cuestiones relacionadas