建设行业信息管理系统网站,邢台建设网站,广州做网站星珀,网站建设电话销售说不需要一. IOC和DI
1. 通过Nuget引入Unity程序集。 PS:【版本#xff1a;5.8.6】
2. 新建DIFactory类#xff0c;用来读取Unity的配置文件并创建Unity容器#xff0c;需要注意的是DIFactory类需要声明成单例。
PS#xff1a;这里采用静态构造函数(必须是无参的)的形式来实现单…一. IOC和DI
1. 通过Nuget引入Unity程序集。 PS:【版本5.8.6】
2. 新建DIFactory类用来读取Unity的配置文件并创建Unity容器需要注意的是DIFactory类需要声明成单例。
PS这里采用静态构造函数(必须是无参的)的形式来实现单例MVC框架的那个框架采用的是 双iflock锁的形式实现的单例结果都一样。
代码分享 1 /// summary2 /// 依赖注入工厂单例的 采用静态构造函数3 /// 读取Unity的配置文件并创建Unity容器4 /// 需要引入程序集“System.Configuration”5 /// /summary6 public class DIFactory7 {8 private static IUnityContainer _Container null;9 static DIFactory()
10 {
11 //1. 固定的4行代码读取配置文件
12 ExeConfigurationFileMap fileMap new ExeConfigurationFileMap();
13 fileMap.ExeConfigFilename Path.Combine(AppDomain.CurrentDomain.BaseDirectory CfgFiles\\UnityConfig.xml);//找配置文件的路径
14 Configuration configuration ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
15 UnityConfigurationSection section (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
16 //2. Unity层次的步骤
17 _Container new UnityContainer();
18 //加载节点的名称为apiContainer
19 section.Configure(_Container, apiContainer);
20 }
21
22 /// summary
23 /// 对外开放函数,用来获取Unity容器
24 /// /summary
25 /// returns/returns
26 public static IUnityContainer GetContainer()
27 {
28 return _Container;
29 }
30 } 3. 新建UnityDependencyResolver类,用来自定义控制器实例化工厂.
特别注意该类这里实现的是IDependencyResolver接口来自WebApi下的程序集而非MVC所以和MVC下的写法有区别.
代码分享 1 public class UnityDependencyResolver : IDependencyResolver2 {3 private IUnityContainer _IUnityContainer null;4 public UnityDependencyResolver(IUnityContainer unityContainer)5 {6 this._IUnityContainer unityContainer;7 }8 9 /// summary
10 /// 获取单个服务
11 /// /summary
12 /// param nameserviceType/param
13 /// returns/returns
14 public object GetService(Type serviceType)
15 {
16 try
17 {
18 return this._IUnityContainer.Resolve(serviceType);
19 }
20 catch (ResolutionFailedException ex)//因为会累计构造多个对象很多是没有去扩展直接null就行
21 {
22 return null;
23 }
24 }
25
26 public IEnumerableobject GetServices(Type serviceType)
27 {
28 try
29 {
30 return this._IUnityContainer.ResolveAll(serviceType);
31 }
32 catch (ResolutionFailedException)
33 {
34 return new Listobject();
35 }
36 }
37
38 public IDependencyScope BeginScope()//每次请求
39 {
40 var child this._IUnityContainer.CreateChildContainer();
41 return new UnityDependencyResolver(child);
42 }
43
44 public void Dispose()
45 {
46 this._IUnityContainer.Dispose();
47 }
48 } 4. 新建CfgFiles文件夹和UnityConfig.xml文件该xml文件需要改属性为“始终复制”。
代码分享 configurationconfigSectionssection nameunity typeMicrosoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration//configSectionsunity!-- unity容器配置注册节点--containerscontainer nameapiContainer!-- type中的两个参数分别是类型名称和DLL程序集的名称 --!-- mapTo中的两个参数分别是类型名称和DLL程序集的名称 --!--分析这里我们需要使用的是TestService,但不直接使用它而是使用它的接口即将【mapTo】里的类型注册给【type】里的类型--register typeWebApiBasic.Interface.ITestService,01-WebApiBasic mapToWebApiBasic.Service.TestService,01-WebApiBasic/register typeWebApiBasic.Interface.ITestService2,01-WebApiBasic mapToWebApiBasic.Service.TestService2,01-WebApiBasic//container/containers/unity
/configuration 5. 在WebApiConfig文件中进行配置把webapi的DependencyResolver换成自己的Unity版本的
config.DependencyResolver new UnityDependencyResolver(DIFactory.GetContainer()); 6. 新建Service文件夹和Interface文件夹分别创建TestService类和ITestService接口并去UnityConfig.xml文件中进行注册(上述xml里已经注册好了)。
代码如下 1 public class TestService : ITestService
2 {
3 public string GetInfor()
4 {
5 return 我是ypf;
6 }
7 } 1 public interface ITestService
2 {
3 string GetInfor();
4 }
7. 在控制器中进行构造函数的注入,注入TestService对象。 public class EighthController : ApiController{private ITestService _ITestService null;public EighthController(ITestService testService){this._ITestService testService;}[HttpGet]public string GetInfor(){var result _ITestService.GetInfor();return result;}} 8. 利用PostMan进行测试 http://localhost:2131/api/Eighth/GetInfor 测试成功。 二. AOP
1. 通过Nuget引入Unity.Interception程序集同时会自动把它依赖的Unity.Abstractions程序集引入。
PS【版本5.5.3】
2. 新增TestService2类和ITestService2接口用来测试AOP。
代码如下 1 public interface ITestService22 {3 string GetInfor2();4 }5 public class TestService2 : ITestService26 {7 public string GetInfor2()8 {9 return 我是ypf2;
10 }
11 } 3. 新建AOP文件夹并新建LogBeforeBehavior类实现IInterceptionBehavior接口在Invoke中写AOP相关的代码。 1 /// summary2 /// Unity为我们提供了一个IInterceptionBehavior接口需要实现这个接口3 /// 接口为我们提供了三个方式(GetRequiredInterfaces、Invoke、WillExecute)实现4 /// WillExecute表示是否执行该行为如果是false这个方法被调用时不会被捕捉。因为我们总是要执行的所以为true5 /// GetRequiredInterfaces将你想要的接口类型和行为联系起来我们暂时不需要所以返回Type.EmptyTypes6 /// Invoke执行方式接口,我们主要使用它7 /// /summary8 public class LogBeforeBehavior : IInterceptionBehavior9 {
10 public bool WillExecute
11 {
12 get { return true; }
13 }
14
15 public IEnumerableType GetRequiredInterfaces()
16 {
17 return Type.EmptyTypes;
18 }
19
20 public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
21 {
22 Console.WriteLine(我是方法执行前执行的业务);
23
24 //下面这句话表示这里执行方法
25 var result getNext()(input, getNext);
26 return result;
27 }
28 } 4. 在UnityConifig.xml文件中配置AOP相关的代码并且给TestService2注入的代码配置AOP相关的LogAopBehavior类。 代码分享 1 configuration2 configSections3 section nameunity typeMicrosoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration/4 /configSections5 unity6 !--Unity的AOP的相关配置--7 sectionExtension typeMicrosoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration/8 !-- unity容器配置注册节点--9 containers
10 container nameapiContainer
11 !--Unity的AOP的相关配置--
12 extension typeInterception/
13 !-- type中的两个参数分别是类型名称和DLL程序集的名称 --
14 !-- mapTo中的两个参数分别是类型名称和DLL程序集的名称 --
15 !--
16 分析这里我们需要使用的是TestService,但不直接使用它而是使用它的接口即将【mapTo】里的类型注册给【type】里的类型
17 --
18 register typeWebApiBasic.Interface.ITestService,01-WebApiBasic mapToWebApiBasic.Service.TestService,01-WebApiBasic/
19 register typeWebApiBasic.Interface.ITestService2,01-WebApiBasic mapToWebApiBasic.Service.TestService2,01-WebApiBasic
20 interceptor typeInterfaceInterceptor/
21 interceptionBehavior typeWebApiBasic.AOP.LogBeforeBehavior,01-WebApiBasic/
22 /register
23 /container
24 /containers
25 /unity
26 /configuration 5. 用PostMan进行测试 http://localhost:2131/api/Eighth/GetInfor2 通过加断点发现执行方法前先进入了LogBeforeBehavior类中进行执行了。