过去几周我一直在玩ASP.NET MVC。我有一个简单的Web应用程序,其表单包含许多下拉列表。
下拉列表中的项目存储在数据库中,我正在使用LINQ to SQL来检索它们。
我的问题是 - 放置此代码的适当位置在哪里?从我到目前为止所读到的内容来看,似乎建议保持Controller“瘦”,但这是我目前拥有此代码的地方,因为它需要在页面加载时执行。
我应该在哪里放置数据库访问代码等?我在下面列出了我的控制器摘录。
感谢。
public ActionResult Index()
{
TranslationRequestModel trm = new TranslationRequestModel();
// Get the list of supported languages from the DB
var db = new TransDBDataContext();
IEnumerable<SelectListItem> languages = db.trans_SupportedLanguages
.Select(c => new SelectListItem
{
Value = Convert.ToString(c.ID),
Text = c.Name.ToString()
});
ViewData["SourceLanguages"] = languages;
ViewData["TargetLanguages"] = languages;
return View();
答案 0 :(得分:4)
您的数据库访问代码应位于存储库中。例如:
public interface ITranslationRepository
{
Translation GetTransaltion();
}
并且控制器将使用此存储库:
public class TransaltionController : Controller
{
private readonly ITranslationRepository _repository;
public TransaltionController(ITranslationRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
// query the repository to fetch a model
Translation translation = _repository.GetTransaltion();
// use AutoMapper to map between the model and the view model
TranslationViewModel viewModel = Mapper.Map<Translation, TranslationViewModel>(model);
// pass the view model to the view
return View(viewModel);
}
}
所以基本思路如下:
关于此存储库的实现,请随意使用您喜欢的任何数据访问技术(EF,NHibernate,Linq to XML,WCF通过Internet调用远程资源,...)
有以下优点:
SelectListItem
),因此可以在除ASP.NET MVC之外的其他类型的应用程序中重复使用。答案 1 :(得分:1)
建议您的数据访问代码包含在自己的项目/程序集中。这是由UI层(ASP.NET MVC应用程序)引用的。这将有助于实现保持控制器精简的目标,并将所有数据访问代码保留在MVC UI项目之外。
这通常会引发关于域实体的另一个问题/讨论:映射到数据存储时。一些建筑师喜欢将实体放在他们自己的独立装配中。这鼓励在其他应用程序中重用。有些人喜欢将实体模型和数据访问代码保存在同一个项目/程序集中。这完全取决于您和您的环境。
举个例子,假设这是一个结算应用程序;持有客户,发票等 您的实现将有所不同,具体取决于您的数据访问策略(ORM,如LINQ To SQL,EF,nHibernate,SubSonic或普通的旧ADO.NET,或从平面文件读取)。
// Assembly: InvoicingDL
public class CustomerRepo
{
public IQueryable<Customer> ListCustomers()
{
return MyDatabase.Customers(); //however you'd get all your customers
}
//etc
}
// Assembly: InvoicingDL
public class InvoicingRepo
{
public IQueryable<Invoice> GetCustomerInvoices(int custID)
{
return MyDatabase.Invoices.Where(i=>i.CustomerID==custID);
}
//etc
}
答案 2 :(得分:1)
查看存储库模式
您的想法是在称为存储库的东西中抽象数据访问,该存储库返回域对象。然后,您的控制器可以使用此存储库从数据库中获取相应的对象,并将它们分配给模型。