EDITASP.NET MVC Software Design Pattern: DI, Repository, Service Layer
Devo mettere livello di servizio e lo strato repository in un unico progetto, in modo che il progetto web è in grado di fare riferimento a oggetti DbContext? Ora il mio web (controller) non è in grado di fare riferimento agli oggetti dbcontext. qual è la strada giusta?
// service and repository are together
(View <- Controller) -> (Service -> Repository -> EF DbContext) -> (DB)
// separate service and repository layer
(View <- Controller) -> (Service) -> (Repository -> EF DbContext) -> (DB)
Qui di seguito sono domanda iniziale
che conosco così è una comunità eccellente per pubblicare le mie domande su design pattern MVC. Per favore, dammi il tuo consiglio e apprezzerò il tuo aiuto. Grazie!
Stiamo pianificando un nuovo progetto e la nostra priorità è sviluppare un'applicazione estensibile e liberamente accoppiata.
Sono nuovo nello sviluppo di software; Ho fatto qualche lettura su MVC Music Store Tutorial e seguito da un libro chiamato Pro ASP.NET MVC 3 Framework by Steven Sanderson (Apress), dal libro, ho imparato a conoscere DDD (Domain driven design) e alcuni altri concetti come l'iniezione di repository e dipendenza. Ho seguito il libro per costruire il sito Web di SportsStore e ho acquisito alcune nozioni di base su DI. Ma personalmente penso che l'esempio non abbia separato il livello della logica aziendale, quindi ho fatto una ricerca al riguardo, ho trovato un modello chiamato Service Layer Pattern e, da quello che ho capito, separa il livello della logica aziendale. Sulla base di questo, sono uscito con una struttura per il mio nuovo progetto (progetto di esempio sotto).
Devo implementare l'interfaccia IDisposable? se sì, dove e perché? Questa struttura è fattibile per un progetto relativamente grande?
campione progettazione di database: del prodotto (uno) ---- (molti) ProductCategoryRs (molti) ---- (uno) Categoria
la soluzione contiene 3 progetti: Repository, Servizio, web
Repository:
definire interfaccia IRepository, operazioni CRUD
Queste firme sono sufficienti? Devo aggiungere TEntity GetById (id oggetto);?
public interface IRepository<TEntity>
{
IQueryable<TEntity> All { get; }
void Create(TEntity item);
void Update(TEntity item);
void Delete(TEntity item);
void SaveChanges();
}
Implementare generica classe repository
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
STOREEntities context;
public Repository()
{
context = new STOREEntities();
}
public IQueryable<TEntity> All
{
get
{
return context.Set<TEntity>();
}
}
public void Create(TEntity item)
{
context.Set<TEntity>().Add(item);
}
public void Update(TEntity item)
{
context.Entry<TEntity>(item).State = System.Data.EntityState.Modified;
}
public void Delete(TEntity item)
{
context.Set<TEntity>().Remove(item);
}
public void SaveChanges()
{
context.SaveChanges();
}
}
Servizio: Definire l'interfaccia IProductService, estendere la logica di business qui.
public interface IProductService
{
IEnumerable<Product> Products { get; }
IEnumerable<Product> Get(Expression<Func<Product, Boolean>> filter);
Product GetByProductId(int productId);
void AddProduct(Product product);
void EditProduct(Product product);
void RemoveProduct(Product product);
void SaveChanges();
}
Implementare progetto Web Product Service
public class ProductService : IProductService
{
IRepository<Product> repository; //Inject
public ProductService(IRepository<Product> repo)
{
repository = repo;
}
public IEnumerable<Product> Products
{
get { return repository.All; }
}
public IEnumerable<Product> Get(Expression<Func<Product, bool>> filter)
{
return repository.All.Where(filter);
}
public Product GetByProductId(int productId)
{
return repository.All.SingleOrDefault(p => p.ProductID == productId);
}
public void AddProduct(Product product)
{
repository.Create(product);
}
public void EditProduct(Product product)
{
repository.Update(product);
}
public void RemoveProduct(Product product)
{
repository.Delete(product);
}
public void SaveChanges()
{
repository.SaveChanges();
}
}
, recuperare i dati da un servizio e convertire in ViewModel e visualizzazione. codice ProductController
public class ProductController : Controller
{
IProductService productService; //inject
public ProductController(IProductService service)
{
productService = service;
}
public ActionResult Index()
{
var products = productService.Products; //retrieve from service layer
return View(products);
}
}
@null: modificherò la mia risposta, per favore dai un'occhiata. – rsenna
-1, Sebbene tu abbia una buona conoscenza di GetById, non è stata la risposta a nessuna delle domande dell'OP. – Levitikon
@Levitikon: ha chiesto di "IDisposable" e io ho risposto. Questa è una risposta (almeno è così che ho imparato a contare, non sono sicuro di te: P) – rsenna