OOP の原則に従っている場合は、必要に応じて実行できると思います。通常、EfDb クラスの実装に必要なものをすべて宣言するインターフェイスがあります。そうすれば、コントローラーはインターフェイスとのみ通信し、EfBd クラスに直接アクセスすることはできません。以下の例を参照してください。
インターフェース
public interface IDataSource
{
//Person Entities
IQueryable<Person> Persons{ get; }
void SavePerson(Person person);
}
EfDb クラス
//Person
public DbSet<Person> Persons { get; set; }
IQueryable<Person> IDataSource.Persons
{
get { return Persons; }
}
public void SavePerson(Person person)
{
using (var context = new EFootballDb())
{
if (person.PersonId == 0)
{
context.Persons.Add(player);
}
else if (person.PersonId > 0)
{
var currentPerson = context.Persons
.Single(p => p.PersonId == person.PersonId);
context.Entry(currentPerson ).CurrentValues.SetValues(person);
}
context.SaveChanges();
}
}
次に、コントローラーで、このようにインターフェイスを呼び出すだけで、おそらく以下のように作成アクションを実装します。
public class PersonController : Controller
{
private readonly IDataSource _dataSource;
public PersonController(IDataSource dataSource)
{
_dataSource = dataSource;
}
[HttpGet]
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Person model)
{
try
{
if (ModelState.IsValid)
{
_dataSource.SavePerson(model);
return RedirectToAction("Index", "Home");
}
}
catch (Exception)
{
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
return View(model);
}
長いデモンストレーションで申し訳ありませんが、オブジェクト指向プログラミング (OOP) などの特定のソフトウェア設計原則に従っている限り、すべて問題ありません。すべては、実装を他のクラスからいかにうまく隠すかにかかっています。私のデモのように、コントローラ クラスは私の EfDb クラスにアクセスできません。