我看到"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-Injection和http://www.dotnetspark.com/kb/1222-inversion-control--beginner-guide.aspx
但是,我仍然在一些问题上绞尽脑汁,不知道为什么这很重要。老实说,我觉得开发人员社区的很大一部分实际上对IoC和单元测试都有这种感觉。很少给出的是什么,并且发现的例子通常很糟糕,或者很难理解。当.NET被引入时,它是独立的.我不需要一堆其他的概念来使简单的程序运行。现在,.NET是一种受人尊敬的语言,一切都在采用它(nHibernate、MVC、MVP、MVVP、云平台、游戏体系结构等)。
(如果我是大错特错,请随时指出。我绝不会以任何方式称自己为“好人”。但我很了解C#,我也非常了解它。我认为自己是一个非常快速的学习者,在这段时间里,我不得不假设有一些‘洞’需要填补)。
发布于 2010-10-21 13:23:11
让我们把所有的IoC框架放在一边,讨论这个概念。IoC并不是一个新概念,它已经存在了很长时间。IoC基本上是为了使您的系统松散地耦合到特定的子系统。我们通过将子系统的公共/核心行为提取成一个契约来实现解耦。合同通常是以界面形式出现的。现在,您依赖于这个接口。您并不担心一个特定的系统如何具体地给出您所追求的行为。
最近我遇到了现实生活中的这件事。我们有一个现有的支付系统,然后我们正在开发一个新的支付系统,以坚持PCI。在这种情况下,您要做的是在接口中提取两个系统的共同特性,然后应用程序只通过接口与这两个系统进行交互。您可以在配置文件或工厂模式中使用标志,或者最终使用IoC框架在应用程序中注入此依赖项。在运行时,应用程序将获得它所依赖的对象。在这样一个环境中,您需要DI/IoC,在这个环境中,由于任何原因,任何给定子系统的使用都存在不确定性。在本例中,新的支付系统无法按时交付,因此我的应用程序需要一个可配置的选项,以便在运行时在任何系统之间切换。如果我不做IoC,那么每当业务改变他们的想法时,我就不得不做代码更改。
IoC的另一个需求是做TDD。与我前面描述的一样,它可以用于开发真实应用程序的模拟实现,也可以用于在real组件仍在开发中时进行测试。
首先,依赖注入是一本很好的书。您还可以从同一个作者这里下载一篇关于DI的免费文章。
更新:为更清晰起见添加代码
public interface ITest
{
void Hello();
}现在我可以有两个不同的具体实现:
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并将依赖关系的显式处理外包给我自己的代码。
using (IUnityContainer container = new UnityContainer())
{
container.LoadConfiguration();
ITest messenger = container.Resolve<ITest>();
messenger.Hello();
}配置相同:
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<assembly name="Injection"/>
<container>
<register type="Injection.ITest" mapTo="Injection.Hi"/>
</container>
</unity>HTH
发布于 2010-10-21 13:06:44
对于一些视频介绍,请查看DimeCasts.net。
我喜欢国际奥委会的主要原因有两个:
发布于 2010-12-01 19:01:47
我认为,当您理解了使用它的原因和时间时,您将开始掌握IoC/DI的内容。我不会太担心使用哪个IoC容器。您基本上可以自己编写一个基本容器(在最基本的级别上,它只是一个字典,它将接口映射到具体的实现)。这里是一个很好的视频,展示了如何做到这一点。
核心概念是它鼓励组件的松散耦合,这意味着代码更容易测试,并且不依赖于其他具体类。
这个链接有关于坚实原则的详细信息,您的问题特别涉及"D“(依赖反转原则),但其他问题也会引起人们的兴趣。
https://stackoverflow.com/questions/3987666
复制相似问题