0

我还会使用以下示例询问 asp.net MVC 的最佳实践和模式:

我有一个项目。这是它的架构:

  1. 楷模
  2. 控制器
  3. 意见
  4. 工具

模型文件夹中,我将每个 ViewModel 都放在单独的类字段中。我将所有表声明(对象)放在一个文件(AccountModels.cs 或 ForumModels.cs)中。我有一个单独的 EF 上下文文件(MyAppContext.cs)。

控制器- 这里我只有控制器类。但也许部分代码会是更好的例子和建议我可以改进什么:

private AppContext db = new AppContext ();

[HttpPost]
[Authorize]
public ActionResult AddGun(GunModel model)
{
    if (ModelState.IsValid)
    {
        Gun gunToAdd = new Gun
        {
            Tilte = model.Tilte,
            AuthorID = UserTools.getUser(User.Identity.Name).UserId,
            AddDate = DateTime.UtcNow,
            Content = model.Content,
            CategoryID = model.CategoryID,
            CategoryName = GunsTools.getCategoryName(model.CategoryID)

        };

        db.Guns.Add(gunToAdd);
        db.SaveChanges();

        return RedirectToAction("Details", new { ID = gunToAdd.ID });

    }

return RedirectToAction("Index");

}

这是 AddGun Action 控制器的一部分。其他 ActionResults 是相似的 - 通常我在我的数据库上下文中使用 lambda 表达式来获取值等。

视图- 单独文件夹中的视图,对于部分视图,我设置了特殊前缀(例如 - _NavigationPartial.cshtml 或 _CalculatorPartial.cshtml)。这里有什么需要改进的地方吗?当然,视图使用 ViewModels,而不是 Models。

至少 -工具。我在这里放了一些类和方法来防止重复代码。这是一些从数据库返回一些对象或字符串的方法,例如 GetUser(..) 或 GetCategoryName(..)。这是一个好习惯吗?

我认为许多年轻的 MVC 开发人员都有相同的项目架构(我个人在几家公司看到过),他们中的许多人可能还想在他们的项目中改进一些东西以成为更好的程序员。

问候

4

1 回答 1

1

正如上面评论中所指出的,很难回答如此广泛的问题,但我会提出几点意见


  • 直接在控制器中使用数据库实体并不是一个好主意,因为这会将控制器与数据库紧密耦合,并可能导致数据暴露给真正不属于那里的视图。

相反,您应该有一个单独的数据层来抽象出枪实体是什么(从数据库的角度来看)和枪模型是什么(从视图的角度来看)的细节

在这里可以找到一个随机选择但很好的 SO 问题


  • 您可以考虑为您的控制器使用依赖注入 (DI)

所以你有一个看起来像这样的构造函数:

readonly AppContext _db;
public GunController(AppContext db)
{
    if (db==null) {throw new ArgumentNullException("db is null");}
   _db=db;
}

您需要使用 DI 容器来完成此操作。可以在此处找到随机选择的(但非常好的)文章


最重要的是,不断提出问题,但尽量让它们更具体,即关于应用程序的特定区域 - 很快你就会对什么是好的做法有一个很好的了解,什么不是好的做法!

于 2013-09-18T15:56:40.330 回答