继承父控制器中断父控制器
问题描述:
现在我有三个控制器。随机(父母),菜单&姓名(子女)。继承父控制器中断父控制器
我有RandomController中的几个方法在数据库上工作,但我想要Menu & Name来指定不同的数据库。但是,如果我从Random中删除数据库上下文声明,则会引发各种错误。
作为一个侧面说明,随机将永远不会对自己的访问,它的存在只是为了用于菜单&名称提供代码
整个控制器是不是真的有必要,但这里有一些我有方法给出一个想法。所有的分贝。当我将ComboContext声明移动到子项时,声明会中断。
public class RandomController : Controller
{
publicCombosContext db = new CombosContext();
//
// GET: /Home/
public ActionResult Index()
{
var rows = db.Combos.OrderBy(a => a.Id).ToArray();
int arrLength = rows.Length;
Random ran = new Random();
Combo newCombo = new Combo
{
MainPrefix = rows[ran.Next(0, arrLength)].MainPrefix,
MainDescriptor = rows[ran.Next(0, arrLength)].MainDescriptor,
MainDish = rows[ran.Next(0, arrLength)].MainDish,
Connector = rows[ran.Next(0, arrLength)].Connector,
SecondaryDescriptor = rows[ran.Next(0, arrLength)].SecondaryDescriptor,
SecondaryDish = rows[ran.Next(0, arrLength)].SecondaryDish
};
return View(newCombo);
}
public ActionResult Create()
{
return View(new Combo());
}
[HttpPost]
public ActionResult Create(Combo model)
{
db.Combos.Add(model);
db.SaveChanges();
return RedirectToAction("Create");
}
public ActionResult Edit(int id)
{
Combo editMe = db.Combos.Find(id);
return View(editMe);
}
[HttpPost]
public ActionResult Edit(Combo editMe)
{
if (ModelState.IsValid)
{
db.Entry(editMe).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(editMe);
}
}
}
答
另一种方法是将一个抽象属性添加到父控制器,其中类型是由您需要使用的上下文实现的接口。
public RandomController : Controller
{
...
protected abstract IContext Db { get; }
...
}
public MenuController : RandomController
{
private SomeContext db = new SomeContext();
...
protected override IContext Db { get { return db; } }
...
}
答
保留在父控制器作为protected
构件分贝上下文,然后通过适当的上下文到使用DI每个子控制器的构造。或者,如果你不想使用依赖注入,你可以只是初始化子构造函数内的上下文。
或作为构造函数参数或抽象属性。 – SLaks 2012-07-30 00:55:23
这对于使用连击背景(如父母)菜单控制工作正常,但是当我到达名称控制器,并开始在构造函数中使用NamesContext,我得到: 错误最佳重载的方法匹配“Controllers.RandomController.RandomController(Models.CombosContext)”有一些无效参数 错误参数1:无法从“Models.NameContext”转换为“Models.CombosContext” – 2012-07-30 01:12:41
您需要使用常见的两种接口成员类型的上下文。 – 2012-07-30 01:16:57