Является ли структура объекта 4 «единица работы», способ к тому, чтобы пойти на общие репозитории?
-
26-09-2019 - |
Вопрос
Я смотрю в создание структуры объекта 4 универсального репозитория для нового проекта ASP.NET MVC, на котором я работаю. Я смотрел на различные учебники, и все, кажется, используют единицу рабочего шаблона ...
От того, что я читал, EF использует это уже в ObjectContext, и вы просто расширяете это, чтобы сделать свои собственные единицы работы.
Почему один пошел к усилиям по этому поводу? Это предпочтительный способ работы с общими репозиториями?
Большое спасибо, Козан.
Решение
Это не так, как я бы работал с общими репозиториями. Прежде всего, я бы поделился 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 может быть немного другой и проще.