1

MVC4かみそりの構文、リポジトリ、および作業単位を使用してWebショップを作成しています。少なくともそれが私がやろうとしていることです。

リポジトリと作業単位の使用法についてはまだ疑問があります。ここで明確にできることを願っています。

私はそれに関して2つの良いチュートリアルを見つけました。

最初のもの: http ://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle

2つ目: 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-application

今、私は両方を読みました、そして私は少し混乱しています。最初のクラスでは、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));
    }
}
4

1 に答える 1

1

2つのアプローチを分析した後、主な違いは、作業単位が使用されている2番目のチュートリアルの場合、エンティティコンテキストは一度だけ宣言されるのに対し、最初のチュートリアルではコンテキストエンティティがすべてのリポジトリで言及されているという結論に達しました。 。

最初のチュートリアルではUnitOfWorkを使用していないため、さまざまなリポジトリが1か所に保存されていません。

結論として、2番目のチュートリアルがより良いアプローチであると言えます。

于 2012-12-06T16:33:49.160 に答える