我一直在寻找我的问题的答案,但找不到答案,主要是因为我真的不知道如何表达它!
我首先在玩 EF 代码,并尝试在使用依赖注入的同时实现某种存储库模式(感谢 Unity)。我还试图保持 SOLID(至少是 SRP 部分),因为我拥有IStaffRepository
和IDepartmentRepository
接口,这些接口又实现IRepository<TEntity>
了提供基本CRUD
方法的接口。
我的问题是,当我需要更新员工的部门时,如何保持 SRP?
我已经读过,由于可能的内存泄漏,对所有存储库使用单个DbContext
实例是不好的做法,所以我不能简单地调用IDepartmentRepository
来获取新部门,因为这将使用 my 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
与部门表挂钩的字段。
我的视图中有一个下拉菜单,看起来像...
@Html.DropDownListFor(m => m.SelectedDepartment, Model.DepartmentList, "--Please Select--")
为这个问题的长度道歉!