РЕДАКТИРОВАТЬ
Должен ли я поместить сервисный слой и слой хранилища в один проект, чтобы веб-проект мог ссылаться на объекты DbContext?Теперь мой веб (контроллеры) не могут ссылаться на объекты dbcontext.Каков правильный путь?
// service and repository are together
(View <- Controller) -> (Service -> Repository -> EF DbContext) -> (DB)
// separate service and repository layer
(View <- Controller) -> (Service) -> (Repository -> EF DbContext) -> (DB)
Ниже приведен оригинальный вопрос
я знаю, что SO - отличное сообщество, чтобы публиковать мои вопросы о шаблонах проектирования mvc.Пожалуйста, дайте мне ваш совет, и я буду признателен за вашу помощь.Спасибо!
Мы планируем новый проект, и нашим приоритетом является разработка расширяемого и слабосвязанного приложения.
Я новичок в разработке программного обеспечения;Я прочитал Учебное пособие по музыкальному магазину MVC , а затем книгу Стивена Сандерсона (Apress) под названием Pro ASP.NET MVC 3 Framework. Из этой книги я узнал о DDD.(Доменное управление) и некоторые другие понятия, такие как репозиторий и внедрение зависимостей.Я следовал книге, чтобы создать сайт SportsStore, и получил некоторое общее представление о DI.Но я лично считаю, что этот пример не отделил слой бизнес-логики, поэтому я провел исследование по этому вопросу, обнаружил шаблон, называемый шаблоном уровня обслуживания, и, насколько я понимаю, он отделяет уровень бизнес-логики.Исходя из этого, я разработал структуру для моего нового проекта (пример проекта ниже).
Нужно ли реализовывать интерфейс IDisposable ?если да, то где и почему?Реальна ли эта структура для относительно крупномасштабного проекта?
Пример дизайна базы данных: Продукт (один) ---- (много) ProductCategoryRs (много) ---- (один) Категория
решение содержит 3 проекта: Репозиторий, Сервис, Интернет
Репозиторий:
Определение интерфейса IRepository, основные операции CRUD
Достаточно ли этих подписей?Должен ли я добавить TEntity GetById (идентификатор объекта); ?
public interface IRepository<TEntity>
{
IQueryable<TEntity> All { get; }
void Create(TEntity item);
void Update(TEntity item);
void Delete(TEntity item);
void SaveChanges();
}
Реализовать универсальный класс репозитория
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();
}
}
Служба: определение интерфейса IProductService, расширение здесь бизнес-логики.
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();
}
Реализация службы продукта
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();
}
}
Веб-проект, получение данныхиз сервиса и конвертировать в viewmodel и отображать.Код продукта Controller
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);
}
}