Pregunta

No estoy tratando de implementar la autenticación y autorización de usuarios utilizando la tabla de funciones, tabla de usuario y una tabla de referencia externa que tiene identificador de usuario, roleid.

Para implementar repoistory genérico para papel actualizar, insertar papel, agregar usuario, agregar usuarios a funciones, un usuario de actualización, el rol de usuario de actualización, el usuario autenticar, sesión de usuario añadir a auditar etc ¿tengo funciones separadas de escritura para cada uno o puedo usar un método genérico para funciones similares. Hay algunas otras operaciones como unirse usuario a otra mesa y obtener los mejores 5 filas sobre la base de condiciones, Insertar en 3 mesas (unido en una tecla) utilizando una sola forma, etc.

Estoy confundido leer muchos artículos y muestras, bcos muestras que veo no entrar en profundidad implemenation excepto las operaciones CRUD.

Me guía o me dirija a una muestra de buena / artículo puede alguien?

¿Fue útil?

Solución

En primer lugar, sigue lo que Frank Schwieterman declaró. Deje que sus depósitos crecen a medida que crece su uso. Además, conocer y hacer uso de las interfaces IQueryable. L2S, junto con Entity Framework, LINQ to NHibernate, y algunos de los nuevos ORM como SubSonic y ORM de Telerik, todo el apoyo de la interfaz IQueryable.

En los casos donde se necesita consultas mutables de su repositorio, pero aún desea el beneficio de intercambiar O mapeadores si es necesario, IQueryable es una herramienta poderosa. Asumir algo como lo siguiente:

public class ProductRepository: IProductRepository
{
    public Product GetByID(int id);
    public IList<Product> GetAll();
    public void Insert(Product product);
    public Product Update(Product product);
    public void Delete(Product product);
}

Este es un repositorio bastante común, con el esqueleto métodos comunes. Con el tiempo, usted puede terminar con un montón más métodos:

public IList<Product> GetByOrder(Order order);
public IList<Product> GetByCategory(Category category);
public IList<Product> GetByQuantityInStock(int quantityInStock);

Esto también es bastante común, y dependiendo de cómo le gusta a abordar el problema, perfectamente aceptable. Sin embargo, en el largo plazo, su repositorio puede crecer a un tamaño manejable, y su interfaz será siempre cambiante. También pierde el beneficio real de utilizar un asignador O detrás de las escenas.

Puede mantener el original, la interfaz de repositorio sencillo, pero aún así proporcionar a sí mismo con una gran flexibilidad, si cambia un método:

public IQueryable<Product> GetAll();

Su repositorio devuelve ahora una consulta, en lugar de una lista de objetos recuperados ya. Ahora está libre de utilizar esta consulta como cualquier otro objeto LINQ habilitado:

var productsWithLowStock = productRepository.GetAll().Where(p => p.Quantity < 10);

var orders = orderRepository.GetAll();
var productsWithOrders = productRepository.GetAll().Where(p => orders.OrderLines.Any(ol => ol.ProductID == p.ProductID));

Una vez que empiece a usar la interfaz IQueryable con los repositorios, se obtiene lo mejor de ambos mundos: Una abstracción mockable alrededor de su acceso a los datos de nivel inferior, así como el poder de consulta dinámica dentro de su código. Puede llevar el concepto un poco más lejos, y crear una clase repositorio de base que implementa IQueryable sí, que le permite eliminar la necesidad de que la llamada GetAll (), y simplemente consultar el repositorio directamente (aunque con otro grado de complejidad.)

Otros consejos

Lo ideal es que no se debe adivinar los requisitos para el repositorio. Una forma de hacerlo es escribir el código que utiliza el repositorio primero, extendiendo la interfaz del repositorio, según sea necesario. Esto se puede lograr si se escribe pruebas unitarias que proporcionan pruebas de dobles para el repositorio.

linq2sql es una implementación de Active Record que es un poco anti patrón, por lo que si desea utilizar patrón de repositorio, entonces no debe utilizar linq2sql sino otra cosa donde es posible tener la separación de las preocupaciones (clase separada de entidad y clase separada para acceso a datos)

o probablemente usted puede de alguna manera, yo no sé nada de eso: D

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top