私は自分の質問に対する答えを探していましたが、それを見つけることができませんでした。主な理由は、それを表現する方法が本当にわからないためです。
私は最初にEFコードで遊んでいて、依存性注入を使用しながら、ある種のリポジトリパターンを実装しようとしています(Unityのおかげで)。私はまた、基本的なメソッドを提供するインターフェースを持っIStaffRepository
ているという点で、SOLID(少なくともSRPの部分)を維持しようとしています。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--")
この質問の長さについてお詫びします!