MVC4かみそりの構文、リポジトリ、および作業単位を使用してWebショップを作成しています。少なくともそれが私がやろうとしていることです。
リポジトリと作業単位の使用法についてはまだ疑問があります。ここで明確にできることを願っています。
私はそれに関して2つの良いチュートリアルを見つけました。
今、私は両方を読みました、そして私は少し混乱しています。最初のクラスでは、GenericRepositoryクラスは抽象であり、TCとTがあります。TCはDbContextオブジェクトであり、Tはクラスです。2番目の小屋では、クラスのみが必要です。
なぜこれらの異なるアプローチ?2番目のチュートリアルでも作業単位を使用しているためですか?一方が他方より優れているのでしょうか、それとも作業単位は必ずしもそうではないのでしょうか。
私のプロジェクトには20個のテーブルがありますが、これは、それらのいくつかが多言語サイトの作成に使用される場合、20個のリポジトリを作成する必要があることを意味しますか?
最後に、これらのリポジトリはModelフォルダに属しますか、それとも「データアクセス層」のような別のリポジトリに属しますか?後者の場合、リポジトリを使用してModelフォルダに何かが属していることはありますか?
誰かが明確さを提供してもらえますか?
PS:私自身のリポジトリコードは次のようになり、機能します(作業単位なし):
IGenericRepository
namespace ArtWebShop.Data_Access_Layer
{
public interface IGenericRepository<T> where T : class
{
IQueryable<T> GetAll();
IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
void Add(T entity);
void Delete(T entity);
void Edit(T entity);
void Save();
}
}
GenericRepository
public abstract class GenericRepository<TC, T> : IGenericRepository<T>
where T : class
where TC : DbContext, new()
{
private TC _entities = new TC();
public TC Context
{
get { return _entities; }
set { _entities = value; }
}
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = _entities.Set<T>();
return query;
}
...
IMenuRepository
public interface IMenuRepository : IGenericRepository<menu_items_local>
{
List<menu_items_local> GetMenuItemsByLanguage(string language);
}
MenuRepository
public class MenuRepository : GenericRepository<ArtWebshopEntities, menu_items_local>, IMenuRepository
{
public List<menu_items_local> GetMenuItemsByLanguage(string language)
{
var menuItemsLocal = Context.menu_items_local.Where(m => m.cultures.name == language);
if (!menuItemsLocal.Any()) throw new HttpException(404, "menu items not found");
return menuItemsLocal.ToList();
}
}
CommonController
public class CommonController : Controller
{
private readonly IMenuRepository _menuRepository;
public CommonController()
{
this._menuRepository = new MenuRepository();
}
public CommonController(IMenuRepository menuRepository)
{
_menuRepository = menuRepository;
}
[HandleError]
[ChildActionOnly]
public ActionResult MenuItems(string language)
{
return PartialView("_menuPartial", _menuRepository.GetMenuItemsByLanguage(language));
}
}