1

我正在使用 MVC4 razor 语法、存储库和工作单元创建一个网上商店。至少那是我想要做的。

我仍然对存储库和工作单元的使用有一些疑问,我希望我能在这里得到一些澄清。

我找到了两个关于它的好教程。

第一个: http ://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle

第二个: http ://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an- asp-net-mvc-应用程序

现在,我都读过,我有点困惑。在第一个中,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));
    }
}
4

1 回答 1

1

在分析了这两种方法后,我得出的结论是,主要区别在于,在使用工作单元的第二个教程中,实体上下文仅声明一次,而在第一个教程中,每个存储库中都提到了上下文实体.

由于第一个教程不使用工作单元,因此不同的存储库没有存储在一个地方。

总之,我可以说第二个教程是更好的方法。

于 2012-12-06T16:33:49.160 回答