热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NetCore+DapperWbpApi架构搭建(四):仓储的依赖注入

上一节我们讲到实体,仓储接口和仓储接口的实现需要遵循约定的命名规范,不仅是规范,而且为了依赖注入,现在我们实现仓储的依赖注入在NetCoreWebApi项目中新添加一个文件夹(Unit),当然你

上一节我们讲到实体,仓储接口和仓储接口的实现需要遵循约定的命名规范,不仅是规范,而且为了依赖注入,现在我们实现仓储的依赖注入

在NetCore WebApi项目中新添加一个文件夹(Unit),当然你也可以直接放在根目录下面,关键是后期类增加了你会找对地方,看起来不是那么乱,添加一个RuntimeHelper

我先说一下实现仓储依赖注入的基本思路,就是通过反射获取所有的程序集,然后在程序集中找到 I+实体+Repository的接口和 实体+Repository的实现类,然后在依赖注入容器中注册他们的对应关系

所以这个RuntimeHelper很明显是通过反射获取程序集使用的

 1 using Microsoft.AspNetCore.Mvc;
 2 using Microsoft.Extensions.DependencyModel;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Reflection;
 7 using System.Runtime.Loader;
 8 
 9 namespace Dinner.WebApi.Unit
10 {
11     [ApiExplorerSettings(IgnoreApi=true)]
12     public class RuntimeHelper
13     {
14         /// 
15         /// 获取项目程序集,排除所有的系统程序集(Microsoft.***、System.***等)、Nuget下载包
16         /// 
17         /// 
18         public static IList GetAllAssemblies()
19         {
20             List list = new List();
21             var deps = DependencyContext.Default;
22             //排除所有的系统程序集、Nuget下载包
23             var libs = deps.CompileLibraries.Where(lib => !lib.Serviceable && lib.Type != "package");
24             foreach (var lib in libs)
25             {
26                 try
27                 {
28                     var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name));
29                     list.Add(assembly);
30                 }
31                 catch (Exception ex)
32                 {
33                     //
34                 }
35             }
36             return list;
37         }
38 
39         public static Assembly GetAssembly(string assemblyName)
40         {
41             return GetAllAssemblies().FirstOrDefault(f => f.FullName.Contains(assemblyName));
42         }
43 
44         public static IList GetAllTypes()
45         {
46             List list = new List();
47             foreach (var assembly in GetAllAssemblies())
48             {
49                 var typeinfos = assembly.DefinedTypes;
50                 foreach (var typeinfo in typeinfos)
51                 {
52                     list.Add(typeinfo.AsType());
53                 }
54             }
55             return list;
56         }
57 
58         /// 
59         /// 根据AssemblyName获取所有的类
60         /// 
61         /// 
62         /// 
63         public static IList GetTypesByAssembly(string assemblyName)
64         {
65             List list = new List();
66             var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName));
67             var typeinfos = assembly.DefinedTypes;
68             foreach (var typeinfo in typeinfos)
69             {
70                 list.Add(typeinfo.AsType());
71             }
72             return list;
73         }
74 
75         public static Type GetImplementType(string typeName, Type baseInterfaceType)
76         {
77             return GetAllTypes().FirstOrDefault(t =>
78             {
79                 if (t.Name == typeName && t.GetTypeInfo().GetInterfaces().Any(b => b.Name == baseInterfaceType.Name))
80                 {
81                     var typeinfo = t.GetTypeInfo();
82                     return typeinfo.IsClass && !typeinfo.IsAbstract && !typeinfo.IsGenericType;
83                 }
84                 return false;
85             });
86         }
87     }
88 }
View Code

上面的那个[ApiExplorerSettings(IgnoreApi=true)]是使用Swagger时使用的,这个我们后面会讲

上面的类就是是反射对程序集的操作

这个我们要使用第三方的Autofac依赖注入框架,所以先引入Nuget包:Autofac.Configuration和Autofac.Extensions.DependencyInjection

下面打开startUp.cs类

先把ConfigureServices方法的返回值由void变为IServiceProvider

然后在ConfigureServices的AddMvc()之后添加下面代码

 1 #region 依赖注入
 2 
 3             var builder = new ContainerBuilder();//实例化容器
 4             //注册所有模块module
 5             builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
 6             //获取所有的程序集
 7             //var assemblys = BuildManager.GetReferencedAssemblies().Cast().ToArray();
 8             var assemblys = RuntimeHelper.GetAllAssemblies().ToArray();
 9 
10             //注册所有继承IDependency接口的类
11             builder.RegisterAssemblyTypes().Where(type => typeof(IDependency).IsAssignableFrom(type) && !type.IsAbstract);
12             //注册仓储,所有IRepository接口到Repository的映射
13             builder.RegisterAssemblyTypes(assemblys).Where(t => t.Name.EndsWith("Repository") && !t.Name.StartsWith("I")).AsImplementedInterfaces();
14             //注册服务,所有IApplicationService到ApplicationService的映射
15             //builder.RegisterAssemblyTypes(assemblys).Where(t => t.Name.EndsWith("AppService") && !t.Name.StartsWith("I")).AsImplementedInterfaces();
16             builder.Populate(services);
17             ApplicatiOnContainer= builder.Build();
18 
19             return new AutofacServiceProvider(ApplicationContainer); //第三方IOC接管 core内置DI容器 
20             //return services.BuilderInterceptableServiceProvider(builder => builder.SetDynamicProxyFactory());
21             #endregion
View Code

这样以来注入就可以了

现在添加一个UsersController进行测试

 1 using Dinner.Dapper.Entities;
 2 using Dinner.Dapper.IRepository;
 3 using Microsoft.AspNetCore.Mvc;
 4 using System;
 5 using System.Collections.Generic;
 6 using System.Threading.Tasks;
 7 
 8 namespace Dinner.WebApi.Controllers
 9 {
10 
11     [Route("api/[controller]/[action]")]
12     public class UsersController : Controller
13     {
14         private readonly IUserRepository userRepository;
15         public UsersController(IUserRepository _userRepository)
16         {
17             userRepository = _userRepository;
18         }
19 
20         /// 
21         /// 获取所有用户
22         /// 
23         /// 
24         /// 
25         [HttpGet]
26         public async Task GetUsers()
27         {
28             List list = await userRepository.GetUsers();
29             return Json(list);
30         }
31 
32         /// 
33         /// 新增用户
34         /// 
35         /// 
36         /// 
37         [HttpPost]
38         public async Task PostUser(Users entity)
39         {
40             entity.Password = Dapper.Helpers.Encrypt.Md5(entity.Password).ToUpper();
41             await userRepository.PostUser(entity);
42         }
43 
44         /// 
45         /// 修改用户信息
46         /// 
47         /// 
48         /// 
49         [HttpPut]
50         public async Task PutUser(Users entity)
51         {
52             try
53             {
54                 entity.Password = Dapper.Helpers.Encrypt.Md5(entity.Password).ToUpper();
55                 await userRepository.PutUser(entity);
56             }
57             catch (Exception ex)
58             {
59                 throw new ArgumentException(ex.Message);
60             }
61         }
62 
63         /// 
64         /// 删除用户
65         /// 
66         /// 
67         /// 
68         [HttpDelete]
69         public async Task DeleteUser(Guid Id)
70         {
71             try
72             {
73                 await userRepository.DeleteUser(Id);
74             }
75             catch (Exception ex)
76             {
77                 throw new ArgumentException(ex.Message);
78             }
79         }
80     }
81 }
View Code

自己测试一下仓储的增删改查吧,看看写的有问题没有

下一节我们讲解Swagger构建WebApi界面

赠送一个Framework版本的依赖注入

 1 #region autofac IOC容器配置
 2             var builder = new ContainerBuilder();
 3 
 4             //注册所有的controller
 5             builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();
 6             //注册所有模块module
 7             builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
 8 
 9             var assemblys = BuildManager.GetReferencedAssemblies().Cast().ToArray();
10 
11             //注册所有继承IDependency接口的类
12             builder.RegisterAssemblyTypes(assemblys)
13             .Where(type => typeof(IDependency).IsAssignableFrom(type) && !type.IsAbstract);
14 
15             //注册服务,所有IxxxxRepository=>xxxxRepository
16             builder.RegisterAssemblyTypes(assemblys).Where(t => t.Name.EndsWith("Repository") && !t.Name.StartsWith("I")).AsImplementedInterfaces();
17           
18             var cOntainer= builder.Build();
19 
20             BaseInfo._cOntainer= container;
21 
22             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
23             #endregion
View Code

 

源码地址: https://github.com/wangyulong0505/Dinner


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 标题: ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
author-avatar
手机用户2502887703
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有