有人可以指导我一些关于IOC的基础教程吗?(最好是.net/c#).
我需要一些代码来包围我的头:)
IOC与DDD类似吗?或测试驱动设计?
在大多数应用程序中,IOC或控制反转是通过代码从UI转换到数据库的路径.这不是一个完整的答案,但它是了解这个概念的最简单的方法之一.
如果您想学习IOC,请进入TDD,因为一旦您反转,您会发现设置测试更容易.
例:
我见过的大多数.NET应用程序的典型流程是这样的:
UserCollection col = BusinessLayer.Class.GetLoggedInUsers(); //Business logic return col;
那么生意是这样的:
UserTable table = DataLayer.Class.GetLoggedInUsers(); return table;
这都是伪代码.要在此示例中使用IOC,请为数据层类添加接口,如IUserRepository.你可以使用泛型,我会建议在引擎盖下.
然后你可以做这样的事情:
IUserRepository repository = SetUpRepository(); UserCollection col = BusinessLayer.Class.GetUsers(repository);
为什么这很重要?对于测试,您可以创建模拟存储库并将其提供给业务类.模拟包含始终相同的数据,这意味着您正在练习代码,而不是端到端测试.
如果你想要C#,这是weblogs.asp.net上的一个基本例子:
阅读 Martin Fowler 撰写的这篇优秀文章.
另外,请查看维基百科文章.
依赖注入是控制反转的最着名的例子,简而言之就是你的代码:
public class FileReader { } public class Application { // inflexible concrete dependency private FileReader fileReader = new FileReader(); }
至:
public interface Reader {} public class FileReader implements Reader {} public class Application { // flexible abstract dependency injected in private Reader reader; public Application(Reader reader) { // constructor injection this.reader = reader; } public void setReader(Reader reader) { // setter injection this.reader = reader; } }
谈谈行话,控制反转是一种支持(其中包括)单一责任原则的模式.
为了解释为什么所有这些都有用,你需要一些阐述,所以请耐心等待.
单一责任基本上意味着您的班级应尽可能独立于系统的其他部分,以尽量减少更改一个部分对另一部分的影响.(您还可以将此更改为更改实现不应触发重新编译项目中的所有文件的事实,例如在C/C++项目中更改.h文件时的情况).副作用是你最终得到了许多只做一件事的小物件,但很好(在一个理想的世界里)
但在大多数情况下,要完成其工作,一个对象需要与其他对象交谈:它取决于它们.
减轻这一点的第一部分是将实现与接口分开.这意味着依赖于接口(或纯粹的抽象类,取决于您选择的语言),因此一个对象不依赖于另一个对象的具体实现.
因此,要使用规范示例,在业务层需求中,您需要执行需要访问的函数 - 用于检索对象的数据层 - 其他一些服务 - 用于记录信息和/或错误的记录器
反过来,每个服务或依赖项都有自己的依赖项,即使它不使用它们,您的类也需要注意这些依赖项.根据引用的数量,设置对象可能会快速失控.现在将它乘以你需要编写的类的数量,最后得到一堆东西.
使用IOC容器基本上可以帮助您摆脱这种混乱.当你需要一个物体时,你不会"新起来".相反,您要求IOC容器为您检索它.容器负责提供准备使用的功能对象,无论其依赖性如何.
这意味着你的类不需要知道它所依赖的类的依赖性,这会减少纠结.此外,它不需要知道实际的类实现了它依赖的服务,这意味着 - 服务实现可以在另一个项目(dll或其他)中定义,因此修改它永远不会影响你的类 - 实现可以是一个根据上下文不同的一个(考虑更改数据库,甚至根据配置甚至应用程序的当前状态转到Web服务来检索信息).
为了尝试回答您的其他问题,IOC是一种模式.TDD和DDD是设计方法,因此不能将另一方面等同.但IOC是支持TDD或DDD的宝贵工具.
我知道首字母缩略词汤和你可以找到的部分样品并不容易.我能给你的最好的建议就是尝试一些小项目,你将抛弃的原型,只是为了处理这些事情.如果你正在寻找工作,这不是一个简单的方法,但绝对值得,如果只是从个人的角度来看.
希望有点帮助.