Я искал ответ на свой вопрос, но не смог его найти, в основном потому, что не знаю, как его сформулировать!
Сначала я играю с кодом EF и пытаюсьреализовать какой-либо шаблон хранилища, используя внедрение зависимостей (благодаря Unity).Я также пытаюсь придерживаться SOLID (ну, по крайней мере, части SRP) в том смысле, что у меня есть интерфейсы IStaffRepository
и IDepartmentRepository
, которые, в свою очередь, реализуют IRepository<TEntity>
, который обеспечивает базовые CRUD
методы.
Мой вопрос: как я могу придерживаться SRP, когда мне нужно обновить отдел персонала?
Я прочитал, что использование одного экземпляра DbContext
- это плохая практикадля всех репозиториев из-за возможных утечек памяти, и поэтому я не могу просто позвонить IDepartmentRepository
, чтобы получить новый отдел, так как это будет использовать отдельный экземпляр моего DbContext
.
Очевидное решение для меня - включитьчто-то вроде ...
Department GetDepartment(int id);
Внутри IStaffRepository
- но разве это не нарушит SRP?
Код в моем контроллере: ...
private IStaffRepository repository;
private IDepartmentRepository departmentRepository;
public StaffController(IStaffRepository repository, IDepartmentRepository departmentRepository)
{
this.repository = repository;
this.departmentRepository = departmentRepository;
}
public ActionResult Edit(int id)
{
return View(new StaffViewModel(repository.GetItem(id)));
}
[HttpPost]
public ActionResult Edit(int id, StaffViewModel model)
{
if (!ModelState.IsValid)
return View(model);
var item = repository.GetItem(id);
// throws error due to different context
item.Department = departmentRepository.GetItem(int.Parse(model.SelectedDepartment));
UpdateModel(item, "Item");
repository.Save();
return RedirectToAction("Member", new {id});
}
И модель StaffMember
содержит ...
public class StaffMember
{
public virtual Department Department { get; set; }
}
И StaffViewModel
выглядит так ...
public class StaffViewModel : ViewModelBase<StaffMember>
{
public SelectList DepartmentList {get;set;}
public string SelectedDepartment {get;set;}
public StaffViewModel()
{
var departmentRepository = new DepartmentRepository();
DepartmentList = new SelectList(departmentRepository.GetCollection(), "ID", "Title", SelectedDepartment);
}
public StaffViewModel(StaffMember item) : this()
{
Item = item;
SelectedDepartment = Item.Department.ID.ToString();
}
public StaffViewModel(List<StaffMember> collection) : this()
{
Collection = collection;
}
}
В базе данных есть поле int Department_ID
, которое подключается к таблице Department.
У меня есть раскрывающийся список, который выглядит как...
@Html.DropDownListFor(m => m.SelectedDepartment, Model.DepartmentList, "--Please Select--")
Извиняюсь за длину этого вопроса!