控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫”依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
依赖倒置原则:
A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。Unity是微软patterns & practices组用C#实现的轻量级,可扩展的依赖注入容器,它为方便开发者建立松散耦合的应用程序。
在我们的工作中经常会用到三层架构。UI层复杂界面;BLL层复杂业务逻辑;DLL复杂数据库操作。调用方式为 UI层调用BLL层,BLL层调用DLL层,然后为了抽象,我们会添加一个IBLL层与IDLL层,分别为BLL和DLL的抽象。
如下代码:
IBLL层代码
BLL层代码
namespace BLL
{
public class ApplePhone : IPhone
{
public void Call()
{
Console.WriteLine("ApplePhone Call!");
}
}
}
BLL层代码
namespace BLL
{
public class AndroidPhone : IPhone
{
public void Call()
{
Console.WriteLine("AndroidPhone Call!");
}
}
}
界面层:
IPhone phone = new ApplePhone();
phone.Call();
但是这样调用,会让界面依赖于实现层。这种调用方式违背了依赖倒置原则。
当然我们也可以使用工厂模式+配置文件的方式进行优化。
不过我们这里介绍一个更好用的东西 Unity 容器。
Unity容器的初步应用
右击引用-->管理NuGet程序包-->搜索Unity-->安装。(使用的为vs2017,不过过程基本类似)
基本方式
IUnityContainer unityContainer = new UnityContainer();//声明一个容器
unityContainer.RegisterType();//将IPhone与ApplePhone进行映射
IPhone phone = unityContainer.Resolve();//反射创建对象
phone.Call();//调用方法
//输出:ApplePhone Call!
别名方式
IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType("Apple");//设置别名
unityContainer.RegisterType("Android");
IPhone phone1 = unityContainer.Resolve("Apple");//通过别名 创建对象
phone1.Call();//输出:ApplePhone Call!
IPhone phone2 = unityContainer.Resolve("Android");
phone2.Call();//输出:AndroidPhone Call!
依赖注入,多层架构
现在我们再添加一些代码:
IBLL层
namespace IBLL
{
public interface IPower
{
}
}
BLL层
namespace BLL
{
public class Power : IPower
{
}
}
namespace BLL
{
public class WinPhone : IPhone
{
public WinPhone()
{
Console.WriteLine("WinPhone 无参数构造函数");
}
public WinPhone(IPower power)
{
Console.WriteLine("WinPhone IPower参数构造函数");
}
public void Call()
{
Console.WriteLine("WinPhone Call!");
}
}
}
我们对代码做了如下的修改:
然后我们在界面层调用
IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<iphone, winphone>();
var phone = unityContainer.Resolve<iphone>();
phone.Call();
</iphone></iphone,>
在调用时系统抛出一个异常:
`
Resolution of the dependency failed, type = ‘IBLL.IPhone’, name = ‘(none)’.
Exception occurred while: while resolving.
Exception is: InvalidOperationException – The current type, IBLL.IPower, is an interface and cannot be constructed. Are you missing a type mapping?
Original: https://www.cnblogs.com/haowuji/p/9777178.html
Author: 下-个路口
Title: IOC Unity
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606616/
转载文章受原作者版权保护。转载请注明原作者出处!