C#依赖注入控制反转IOC实现详解
2021-06-22 07:07
标签:width gis container mvc tor 实现 获取 内容 组件 IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。 举个例子,组件A中有类ClassA,组件B中有接口IB和其对应的实现类B1和B2。 那么,现在ClassA需要利用IB接口来做一些事情,例如: 现在的问题来了,IB b = ??? 中这三个???要写什么代码?是要写成 IB b = new B1(),还是要写成IB b = new B2() ? 不管是哪一种,都会让ClassA强依赖于IB的实现。 在上面这种方案中,ClassA通过new一个B1或B2来实现对IB的依赖的获取,换句话说,ClassA在主动获取依赖。 这样的设计会让ClassA很难扩展,那我们要改良设计:使用依赖注入。上面说到了,问题出在new这里,也就是依赖是Class去主动获取的,那我们就要解决这个问题:不要去主动获取对IB的依赖(通过new),而让这个依赖从ClassA的外面“注入”进来。注入有多种方式,比较常用的一种是通过构造函数注入,那么,我们要把ClassA改成: public ClassA(IB b) { public DoSomething() { 可以看到,通过把IB这个依赖从构造函数中“注”进来后,ClassA就不依赖IB的实现了。还可以发现,这个重构过程中,我们是把"ClassA主动获取对IB的依赖”变成“把对IB的依赖从外部注入到ClassA中”,依赖的方向反转了,所以,依赖注入又称“控制反转”。 IoC框架(如Unity, Autofac,Spring.Net),其中Unity是微软自己封装的,另外可以利用Extnesions.Dependency动态生成类(参考之前的将RFCTable转为List 下面以Unity作为介绍: Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题。构建一个成功应用程序的关键是实现非常松散的耦合设计。下面介绍一下c#中使用unity的方法(我是以webapi项目为例,但本例中并没有针对webapi做特殊处理) 新建一个mvc4 webapi项目,下面的例子只用到get方法 用nuget安装unity,如图 新建一个接口类,以及继承该接口的两个类 直接在api/values的get中尝试简单实现unity using (IUnityContainer container = new UnityContainer()) { container.RegisterType IBook a = container.Resolve var strResult = a.Write(); return strResult; } 然后在浏览器中查看,页面显示的返回值,是BBook的 如果container.RegisterType config中代码如下 在configSections中加入 type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> 在configuration中加入 注意 type="testunity.Models.IBook,testunity" mapTo="testunity.Models.ABook, testunity" testunity.Models.IBook是命名空间加类名 testunity是程序集的名称 然后cs的代码改成 using (IUnityContainer container = new UnityContainer()) { UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); configuration.Configure(container); IBook a = container.Resolve var strResult = a.Write(); return strResult; } 在浏览器中可以看到返回结果对应的是config中register的那个类 每次调用都要写IUnityContainer container = new UnityContainer()显然不是好办法 那就把container封装到一个单列类中 简单实现如下 public class ServiceLocator:IServiceProvider { private readonly IUnityContainer _container; private static readonly ServiceLocator instance = new ServiceLocator(); private ServiceLocator() { UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); _container = new UnityContainer(); section.Configure(_container); } public static ServiceLocator Instance { get { return instance; } } public object GetService(Type serviceType) { return _container.Resolve(serviceType); } public T GetService { return _container.Resolve } } cs代码修改如下 IBook a = ServiceLocator.Instance.GetService var strResult = a.Write(); return strResult; C#依赖注入控制反转IOC实现详解 标签:width gis container mvc tor 实现 获取 内容 组件 原文地址:https://www.cnblogs.com/lonelyxmas/p/10217643.htmlpublic class ClassA {
public void DoSomething() {
IB b = ???
b.DoWork();
}
}public class ClassA {
private IB b;
this.b = b;
}
this.b.DoWork();
}
}
下一篇:C#-操作Excel