首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IoC和ASP.NET MVC,从哪里开始的?

IoC和ASP.NET MVC,从哪里开始的?
EN

Stack Overflow用户
提问于 2010-10-21 12:56:03
回答 3查看 2.3K关注 0票数 24

我看到"IoC“和"DI”在ASP.NET MVC中几乎随处可见。虽然我很清楚..。“某种程度上”,这是一个几乎模棱两可的,无定形的浮动概念,似乎已经从我身边掠过,或者我只是找不到正确的地方。随着即将发布的ASP.NET MVC 3.0,我看到的更多。如此之多,以至于我觉得这是编程的一个完整部分,我只是不知道

我试着寻找关于主题的书籍,但我发现的大多数书似乎都有很多假设( Ruby中的历史,理解它是什么,但不知道如何使用它,等等)。

我只是先问一下。什么是 IoC,为什么我会关心它?是否有任何体面的网站,从初学者程序员的角度报道这一点?假设我对此一无所知。假设我只知道C#。我阅读了C#的每一本书、博客和教程,从.NET 1.1到.NET 2.0,当.NET 3.5和LINQ命中时,它变得如此之多,以至于我跟不上。我是一个在ASP.NET MVC/C#中工作的新手开发人员,我情不自禁地觉得我错过了一些非常重要的东西。(我对DI (依赖注入)有很多相同的感觉)

我搜索过,看过博客,看过Castle.Windsor,看过示例代码,浏览过书籍和网络广播,现在还很黑暗。这感觉就像工作中那些你应该知道的内部故事之一,但出于某种原因,你不知道,学校也没有为我做好真正的准备。

对于我来说,StackOverflow一直是开发社区中最好的。通过大学和入门工作,以及低水平的自由职业者工作,我从其他程序员那里融合了我的编程教育(但据我所知,这并不是必要的羞愧)。因此,我再一次简单地向社会人士说一句。

,嗯?我不明白,

与我的许多试图进入同一个领域的同事们交谈时,他们中的许多人都有同样的感受。因此,我不由自主地感觉到,我们这些“新手”程序员错过了这些概念编码方法的备忘录。我不仅想得到这个问题的答案,而且我认为,对像我这样试图理解这个问题的人来说,一条好线索可能是一个明智的想法(如果存在的话,需要让它变得更加明显)。

我发现一些有用的东西是http://www.theserverside.com/news/1321158/A-beginners-guide-to-Dependency-Injectionhttp://www.dotnetspark.com/kb/1222-inversion-control--beginner-guide.aspx

但是,我仍然在一些问题上绞尽脑汁,不知道为什么这很重要。老实说,我觉得开发人员社区的很大一部分实际上对IoC和单元测试都有这种感觉。很少给出是什么,并且发现的例子通常很糟糕,或者很难理解。当.NET被引入时,它是独立的.我不需要一堆其他的概念来使简单的程序运行。现在,.NET是一种受人尊敬的语言,一切都在采用它(nHibernate、MVC、MVP、MVVP、云平台、游戏体系结构等)。

(如果我是大错特错,请随时指出。我绝不会以任何方式称自己为“好人”。但我很了解C#,我也非常了解它。我认为自己是一个非常快速的学习者,在这段时间里,我不得不假设有一些‘洞’需要填补)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-21 13:23:11

让我们把所有的IoC框架放在一边,讨论这个概念。IoC并不是一个新概念,它已经存在了很长时间。IoC基本上是为了使您的系统松散地耦合到特定的子系统。我们通过将子系统的公共/核心行为提取成一个契约来实现解耦。合同通常是以界面形式出现的。现在,您依赖于这个接口。您并不担心一个特定的系统如何具体地给出您所追求的行为。

最近我遇到了现实生活中的这件事。我们有一个现有的支付系统,然后我们正在开发一个新的支付系统,以坚持PCI。在这种情况下,您要做的是在接口中提取两个系统的共同特性,然后应用程序只通过接口与这两个系统进行交互。您可以在配置文件或工厂模式中使用标志,或者最终使用IoC框架在应用程序中注入此依赖项。在运行时,应用程序将获得它所依赖的对象。在这样一个环境中,您需要DI/IoC,在这个环境中,由于任何原因,任何给定子系统的使用都存在不确定性。在本例中,新的支付系统无法按时交付,因此我的应用程序需要一个可配置的选项,以便在运行时在任何系统之间切换。如果我不做IoC,那么每当业务改变他们的想法时,我就不得不做代码更改。

IoC的另一个需求是做TDD。与我前面描述的一样,它可以用于开发真实应用程序的模拟实现,也可以用于在real组件仍在开发中时进行测试。

首先,依赖注入是一本很好的书。您还可以从同一个作者这里下载一篇关于DI的免费文章。

更新:为更清晰起见添加代码

代码语言:javascript
运行
复制
public interface ITest
    {
        void Hello();
    }

现在我可以有两个不同的具体实现:

代码语言:javascript
运行
复制
public class Hi : ITest
    {
        public void Hello()
        {
            HttpContext.Current.Response.Write("Hi there!");
        }
    }

    public class HelloMessage : ITest
    {
        public void Hello()
        {
            HttpContext.Current.Response.Write("Hello there!");
        }
    }


ITest messenger;

if (User Needs "Hi")
{
   messenger = new Hi();
}
else if (User Needs "Hello")
{
   messenger = new HelloMessage();
}

messenger.Hello(); 

我的应用程序所要做的就是调用契约中可用的方法。现在,应用程序正在显式地处理依赖项,但没有任何具体的实现。然而,它仍然与这两个具体的实现相关联。IoC框架帮助我们将这项工作外包给一个配置文件。在那里,我可以提供任何其他具体的实现,不管它是如何实现的,并且应用程序将继续工作,而不会发生任何代码更改。

下面是我使用Unity2并将依赖关系的显式处理外包给我自己的代码。

代码语言:javascript
运行
复制
using (IUnityContainer container = new UnityContainer())
            {
                container.LoadConfiguration();

                ITest messenger = container.Resolve<ITest>();

                messenger.Hello();
            }

配置相同:

代码语言:javascript
运行
复制
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <assembly name="Injection"/>
  <container>
    <register type="Injection.ITest" mapTo="Injection.Hi"/>
  </container>
</unity>

HTH

票数 13
EN

Stack Overflow用户

发布于 2010-10-21 13:06:44

对于一些视频介绍,请查看DimeCasts.net

我喜欢国际奥委会的主要原因有两个:

  1. 更简单的单元测试。
  2. 更容易交换后端数据进行测试。假设你有一个IPersonRepository。您的代码实现了一个从数据库加载数据的PersonRepository。但是,如果数据库中没有任何数据,或者数据库尚未建立,怎么办?您可以使用IoC实现一个DummyPersonRepository,该DummyPersonRepository将从其他地方加载数据,比如XML文件或硬编码的数据。
票数 2
EN

Stack Overflow用户

发布于 2010-12-01 19:01:47

我认为,当您理解了使用它的原因和时间时,您将开始掌握IoC/DI的内容。我不会太担心使用哪个IoC容器。您基本上可以自己编写一个基本容器(在最基本的级别上,它只是一个字典,它将接口映射到具体的实现)。这里是一个很好的视频,展示了如何做到这一点。

核心概念是它鼓励组件的松散耦合,这意味着代码更容易测试,并且不依赖于其他具体类。

这个链接有关于坚实原则的详细信息,您的问题特别涉及"D“(依赖反转原则),但其他问题也会引起人们的兴趣。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3987666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档