Является ли структура объекта 4 «единица работы», способ к тому, чтобы пойти на общие репозитории?

StackOverflow https://stackoverflow.com/questions/2818029

Вопрос

Я смотрю в создание структуры объекта 4 универсального репозитория для нового проекта ASP.NET MVC, на котором я работаю. Я смотрел на различные учебники, и все, кажется, используют единицу рабочего шаблона ...

От того, что я читал, EF использует это уже в ObjectContext, и вы просто расширяете это, чтобы сделать свои собственные единицы работы.

Источник: http://dotnet.dzone.com/news/using-Unit-work-pattern-entity?utm_source=feedburner&utm_medium=feeds&utm_campaign=feed%3a5zones%2FDOTTOTNET+ (.NET+ZONE)

Почему один пошел к усилиям по этому поводу? Это предпочтительный способ работы с общими репозиториями?

Большое спасибо, Козан.

Это было полезно?

Решение

Это не так, как я бы работал с общими репозиториями. Прежде всего, я бы поделился ObjectContext между классовым элементом, CalssBropository и другими репозиториями в текущем запросе. Использование контейнера IOC, используя инъекцию и поведение запроса:

Вот как мои общие репозитории похожи:

public interface IRepository<T>
{
    //Retrieves list of items in table
    IQueryable<T> List();
    IQueryable<T> List(params string[] includes);
    //Creates from detached item
    void Create(T item);
    void Delete(int id);
    T Get(int id);
    T Get(int id, params string[] includes);
    void SaveChanges();
}

public class Repository<T> : IRepository<T> where T : EntityObject
{
    private ObjectContext _ctx;

    public Repository(ObjectContext ctx)
    {
        _ctx = ctx;
    }


    private static string EntitySetName
    {
        get
        {
            return String.Format(@"{0}Set", typeof(T).Name);
        }
    }

    private ObjectQuery<T> ObjectQueryList()
    {
        var list = _ctx.CreateQuery<T>(EntitySetName);
        return list;
    }

    #region IRepository<T> Members

    public IQueryable<T> List()
    {
        return ObjectQueryList().OrderBy(@"it.ID").AsQueryable();
    }

    public IQueryable<T> List(params string[] includes)
    {
        var list = ObjectQueryList();

        foreach(string include in includes)
        {
            list = list.Include(include);
        }

        return list;
    }

    public void Create(T item)
    {
        _ctx.AddObject(EntitySetName, item);
    }

    public void Delete(int id)
    {
        var item = Get(id);
        _ctx.DeleteObject(item);
    }

    public T Get(int id)
    {
        var list = ObjectQueryList();
        return list.Where("ID = @0", id).First();
    }

    public T Get(int id, params string[] includes)
    {
        var list = List(includes);
        return list.Where("ID = @0", id).First();
    }

    public void SaveChanges()
    {
        _ctx.SaveChanges();
    }

    #endregion

}

ObjectContext вводится через конструктор. Список () Методы Возврат IQueryable для дальнейшей обработки в объектах бизнес-слоя (службы). Средний слой возвращается список или IENumerable, поэтому в представлениях нет отложенного выполнения.

Этот код был создан с использованием EF1. Версия EF4 может быть немного другой и проще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top