控制反转
(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
Spring.NET
为建立企业级应用提供了一套轻量级的解决方案。通过Spring.NET,我们可以用统一且透明的方式来配置应用程序。Spring.NET的重点是为中间层提供声明式事务管理,以及一个功能齐全的ASP.NET扩展框架。Spring.NET是非侵入式的,代码对框架本身不会产生任何依赖。
一、控制台程序尝鲜
1.新建解决方案,DemoNuget(控制台程序)、IService(类库)、Service(类库),在分别新建一个接口和2个类。如下
namespace IService { public interface IBookService { string ISBN { get; set; } } } namespace Service { public class BookService : IBookService { public string ISBN { get; set; } } }
2.DemoNuget添加引用 Service和IService(注:真实项目中,DemoNuget不应该引用Service,这里添加了是为了程序生成时,自动将程序集“Service”复制到程序运行目录下,以免Spring.net无法加载程序集的问题),然后,继续对DemoNuget右键“管理Nuget程序包”
我这里用的是最新的2.0.1版本,安装后,会添加2个引用,分别是 “Spring.Core”和“Common.Logging”,前者是Spring.net的核心,后者是日志记录组件,所以也可以手动引入这两个类库。
3.打开DemoNuget下的“Appconfig”文件。内容类似为这样的(不一样也没关系):
<?xml version="1.0" encoding="utf-8" ?> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> </configuration>
然后将下面一段代码复制到“Appconfig”文件中
<!--Spring.net Ioc start--> <configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections> <spring> <context> <resource uri="config://spring/objects"/> <resource uri="file://IServices.xml"/> </context> <objects xmlns="http://www.springframework.net"></objects> </spring> <!--Spring.net Ioc end-->
最终结果是这样的
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <!--Spring.net Ioc start--> 4 <configSections> 5 <sectionGroup name="spring"> 6 <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> 7 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 8 </sectionGroup> 9 </configSections> 10 <spring> 11 <context> 12 <resource uri="config://spring/objects"/> 13 <resource uri="file://IServices.xml"/> 14 </context> 15 <objects xmlns="http://www.springframework.net"></objects> 16 </spring> 17 <!--Spring.net Ioc end--> 18 19 <startup> 20 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> 21 </startup> 22 </configuration>
其中,第13行代码是加载一个“IServices.xml”的xml文件,所以下一步在DemoNuget中新建一个“IServices.xml”的xml文件,内容如下
新建完成后,对着“IServices.xml”右键属性,选择“始终复制”,目的与前面引用“Service”道理是一样的。
4.开始写代码吧,
1 namespace DemoNuget 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 IApplicationContext ctx = ContextRegistry.GetContext(); 8 IBookService ibook = (IBookService)ctx.GetObject("ibookService"); 9 Console.WriteLine(ibook.ISBN); 10 11 Console.Read(); 12 } 13 } 14 }
对照着前面一张图,自行脑补吧。运行,会出现如下结果: