我正在使用 MVC4 razor 语法、存储库和工作单元创建一个网上商店。至少那是我想要做的。
我仍然对存储库和工作单元的使用有一些疑问,我希望我能在这里得到一些澄清。
我找到了两个关于它的好教程。
现在,我都读过,我有点困惑。在第一个中,GenericRepository 类是抽象的,具有 TC 和 T。TC 是 DbContext 对象,T 是类。在第二个 tut 中,只需要一个类。
为什么会有这些不同的方法?是因为第二个教程也使用了工作单元吗?是一个比另一个更好,还是工作单元真的不一定?
在我的项目中,我有 20 个表,这是否意味着如果其中一些用于创建多语言站点,我必须创建 20 个存储库?
最后,这些存储库是属于模型文件夹还是属于“数据访问层”之类的单独文件夹?如果是后者,是否有任何东西属于使用存储库的模型文件夹?
有人可以提供清楚吗?
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();
}
}
通用存储库
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);
}
菜单库
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();
}
}
通用控制器
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));
}
}