选择哪种模式?Asp.NETMVC4

选择哪种模式?Asp.NETMVC4,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-4,dependency-injection,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Dependency Injection,我真的很困惑,我从《Apress pro Asp.net Mvc 4》一书中了解到,Mvc 4的最佳模式是依赖注入(将数据库的模型数据等放入另一个项目(域),然后创建接口和这些接口的实现,然后用Ninja将其连接到控制器 所有与数据库的连接都只来自数据层解决方案,这是viewModel中web解决方案中唯一的模型 控制器 public class ProductController : Controller { private IProductRepository repository

我真的很困惑,我从《Apress pro Asp.net Mvc 4》一书中了解到,Mvc 4的最佳模式是依赖注入(将数据库的模型数据等放入另一个项目(域),然后创建接口和这些接口的实现,然后用Ninja将其连接到控制器

所有与数据库的连接都只来自数据层解决方案,这是viewModel中web解决方案中唯一的模型

控制器

public class ProductController : Controller
{

    private IProductRepository repository;

    public ProductController(IProductRepository productRepository)
    {
        this.repository = productRepository;
    }
    ....
}
还有Ninject

 ninjectKernel.Bind<IProductRepository>().To<EFProductRepository>();
哪种模式的性能更好(fast网站)

不可能回答。在这两种方法中,您可能都有非性能代码。不要试图过早地优化性能,优化干净且可支持的代码,并解决实际场景中实际观察到的性能瓶颈

在控制器中使用“public Db=new Db();”而不是仅在域层(解决方案)中使用它是不好的

这是一个分离关注点和隔离依赖关系的问题。如果控制器在内部实例化与数据库的连接,则该控制器只能在该数据库的上下文中使用。这将使控制器的单元测试非常困难。这还意味着替换数据库意味着修改控制器r、 在这种情况下不需要修改

依赖注入框架只是一种解决问题的方法,其思想是如果对象a(控制器)需要对象B(数据库对象)的实例然后它应该要求向它提供实例,而不是在内部实例化它。这里的直接好处是对象B可以只是一个接口或抽象类,可以有许多不同的实现。对象A不应该关心给它的是哪个实现,只要它满足相同的可观察行为或者

通过反转依赖项(无论是否使用依赖项注入框架),可以从控制器中删除对数据库的依赖项。控制器只处理客户端启动的请求。其他一些东西处理数据库依赖项。这使这两个单独的对象更具可移植性和可重用性

使用依赖注入的优点是什么?使用我的模式还不错吗

如上所述。依赖项注入是实现依赖项反转的一种方法,这是本例的核心目标。请注意,有几种不同的方法可以实现这一点。一些框架更喜欢构造函数注入,一些支持属性/设置器注入等。我个人倾向于使用服务定位器模式,它增加了能够抽象依赖关系注入器本身的依赖关系的好处

如果在使用过程中遇到任何问题,那么使用您的方法是“不好的”。有好的模式可以解决各种问题,但是如果您的项目没有合理地存在这些问题,那么使用这些模式将过于工程化,实际上会损害代码的可支持性。因此,与其他任何情况一样,“这取决于”

将项目分为两个数据层解决方案的优势是什么

两个解决方案?或同一解决方案中的两个项目?(导致两个程序集。)优点是您可以重复使用其中一个而不依赖另一个。例如,在您发布的一些代码中,有一个对存储库模式的引用。如果您有一个程序集,它只用于实现后端数据的存储库,那么任何应用程序都可以使用这些存储库。如果相反,它是所有这些都是直接在MVC应用程序中实现的,没有其他应用程序可以使用它,它与MVC应用程序紧密耦合


如果您永远不需要重复使用该功能,那么这并不是世界末日。如果您想重复使用该功能,将其分离为一个可移植的程序集,在内部隔离其依赖项将允许这样做。

您可能想阅读这个问题-依赖项注入是关于代码可维护性和安全性的(不要重复)。它与应用程序速度无关。事实上,从技术上讲,它可能会降低应用程序的速度,即使只是无限小。然而,这并不意味着它仍然不被推荐。或者像任何其他模式一样,你也可以采取完全不同的方式。@Chris Pratt,使用依赖项注入真的没有必要吗?我不喜欢它太复杂了,通过'f12'你只看到接口而不是具体的类,依赖注入和将项目插入域模型的好处是什么?你不需要依赖注入接口,只需要注入具体的class@DanielEzra:完成。看来你要找的是一些介绍依赖项注入的管道教程和示例。你问了一个不错的问题,但这是一个非常概念性的问题。我唯一能给你的建议是练习,看看它能带你去哪里。我个人在代码中经常使用依赖项注入,但我写的大部分内容都从中受益。不是每个项目都能从中受益像其他任何东西一样,依赖注入框架是一种工具。它应该被应用(并且正确地应用)只有在有利的情况下才这样做。@David最后一次加1sentence@CharlieBrown:虽然无条件地提倡DI听起来并不好,但在大多数情况下,新手从学习中受益并遵循这一原则。请注意,对于新手来说,“只有在有益的地方”并没有多大意义,可能不应该被理解为“如果你不理解就不要使用”。我的教学经验是,开发人员从学习和遵循DI中受益,很少情况下,他们不总是因为DI太难而导致的(令人惊讶的是,这是可能的)。@WiktorZychla你的观点是很好的。不仅应该尽早和经常学习DI,而且应该如此
 public class LanguageController : AdminController
    {
         public Db db = new Db();

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

        //
        // GET: /Admin/Language/
        public ActionResult Index()
        {
            return View(db.Languages.ToList());
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(short id)
        {
            Language language = db.Languages.Find(id);
            db.Languages.Remove(language);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    ...
}