有人可以解释微软统一?
我一直在阅读有关Unity(dependency injection,控制反转)的MSDN上的文章,但我想我需要用简单的术语(或简单的例子)来解释它。 我熟悉MVPC模式(我们在这里使用它),但是我还不能真正掌握这个Unity的东西,而且我认为这是我们应用程序devise的下一步。
Unity只是一个IoC“容器”。 谷歌结构图,并试试它。 我认为,当IoC的东西对你来说是新的时,更容易一点。
基本上,如果你了解IoC,那么你就明白你正在做的是颠倒对象创build时的控制。
没有Ioc:
public class MyClass { IMyService _myService; public MyClass() { _myService = new SomeConcreteService(); } }
使用IoC容器:
public class MyClass { IMyService _myService; public MyClass(IMyService myService) { _myService = myService; } }
如果没有IoC,那么依赖IMyService的类必须新build要使用的具体服务版本。 这是不利的,原因很多(你已经将你的类与IMyService的具体版本联系起来,你不能轻易地进行unit testing,不能轻易改变它等等)
使用IoC容器,您可以“configuration”容器来为您解决这些依赖关系。 因此,使用基于构造函数的注入机制,只需将接口传递给IMyService依赖项即可。 当您使用容器创buildMyClass时,您的容器将为您parsingIMyService依赖项。
使用StructureMap,configuration容器如下所示:
StructureMapConfiguration.ForRequestedType<MyClass>().TheDefaultIsConcreteType<MyClass>(); StructureMapConfiguration.ForRequestedType<IMyService>().TheDefaultIsConcreteType<SomeConcreteService>();
所以你所做的是告诉容器:“当有人请求IMyService时,给他们一个SomeConcreteService的副本。 而且你还指定了当有人要求MyClass时,他们得到一个具体的MyClass。
这完全是一个IoC容器。 他们可以做更多的事情,但这是它的主旨 – 他们为您解决依赖关系,所以您不必(并且不必在整个代码中使用“new”关键字)。
最后一步:当你创build你的MyClass时,你可以这样做:
var myClass = ObjectFactory.GetInstance<MyClass>();
希望有所帮助。 随时给我发电子邮件。
我刚刚观看了由David Hayden提供的30分钟统一dependency injectionIoC Screencast,并认为这是一个很好的例子。 这里是演出笔记的片段:
截屏显示了Unity IoC的几种常见用法,例如:
- 创build不在容器中的types
- 注册和解决TypeMappings
- 注册和parsing命名的TypeMappings
- Singletons,LifetimeManagers和ContainerControlledLifetimeManager
- 注册现有的实例
- 向现有实例注入依赖关系
- 通过App.config / Web.config填充UnityContainer
- 通过注入API指定相关性,而不是依赖性属性
- 使用嵌套(父 – 子)容器
Unity是一个类似于许多其他库的库,可以让您获得所需types的实例,而无需自己创build它。 如此给予。
public interface ICalculator { void Add(int a, int b); } public class Calculator : ICalculator { public void Add(int a, int b) { return a + b; } }
当使用类似ICalculator的IoC(反转控制)(这个例子是理论上的,技术上不正确的)时,你会使用像Unity这样的库来注册计算器。
IoCLlibrary.Register<ICalculator>.Return<Calculator>();
所以现在当你想要一个ICalculator的实例,你只是…
Calculator calc = IoCLibrary.Resolve<ICalculator>();
通常可以将IoC库configuration为每次parsing某个types时都保存一个单例或创build一个新实例。
现在让我们假设你有一个依赖ICalculator的类来存在
public class BankingSystem { public BankingSystem(ICalculator calc) { _calc = calc; } private ICalculator _calc; }
你可以设置库来创build一个对象到构造函数中。
所以DI或dependency injection意味着注入其他可能需要的对象。
这个家伙WilcoxTutorials给出了针对初学者的Unity容器的一个很好的演示。
第1部分: http : //www.youtube.com/watch?v=CWwe9Z0Gyew
第2部分: http : //www.youtube.com/watch?v = PsIbevgzQQE
在不到半个小时的时间里,您将了解基础知识!
Unity是一个IoC。 IoC的要点是抽象types之外的types之间的依赖关系。 这有几个好处。 首先,它是集中完成的,这意味着当依赖关系发生变化时(这可能是unit testing的情况),您不必更改大量的代码。
此外,如果使用configuration数据而不是代码完成配线,则可以在部署后重新连接依赖关系,从而在不更改代码的情况下更改应用程序的行为。
MSDN有一个使用Unity的dependency injection开发者指南,这可能是有用的。
开发人员指南从什么是dependency injection的基础开始,并继续介绍如何使用Unity进行dependency injection。 截至2014年2月,开发者指南涵盖了2013年4月发布的Unity 3.0。