如何在 ASP.Net Core 中使用 Lamar
ASP.Net Core 自带了一个极简的 开箱即用
的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器
来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和维护性,你可以使用 依赖注入
来改进你的代码设计,而不像原来那样到处都是 new 对象。
Lamar 是一个流行的,高效的,模块化的 IOC 容器,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 Lamar。
为什么要用 Lamar 实现依赖注入
要说 .NET 世界最早的依赖注入容器,当属 StructureMap
,但 StructureMap
最大的缺点就是性能问题,而本篇的 Lamar 则非常轻量级,并提供了丰富的可供调用API,Lamar 和 StructureMap 非常类似,如果你以前 StructureMap 玩的溜的话,切到 Lamar 上是非常容易的。
安装 Lamar
要想在 ASP.Net Core 中使用 Lamar,需要通过 nuget 安装如下两个包。
Lamar
Lamar.Microsoft.DependencyInjection
你可以通过可视化界面 Manage NuGet Packages
。
或者如下命令进行安装。
Install-Package Lamar
Install-Package Lamar.Microsoft.DependencyInjection
创建 IDBManager 和 DBManager
首先创建一个 IDBManager 接口类,用于后续做依赖注入用,代码定义如下:
public interface IDBManager{void Initialize();bool Save<T>(T obj);}
接下来定义 DBManager 类并实现接口 IDBManager ,代码定义如下:
public class DBManager: IDBManager{public void Initialize(){//Write some initialization code here}public bool Save<T>(T obj){//Write your code herereturn true;}}
配置 Lamar
Lamar.Microsoft.DependencyInjection
包提供了一个 UseLamar()
方法能够将 Lamar 引入到 ASP.Net Core 基础架构中,下面的代码展示了如何去实现。
public class Program{public static void Main(string[] args){CreateHostBuilder(args).UseLamar().Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});}
配置 Lamar 容器
接下来可以在 ConfigureServices()
方法中配置 Container 容器,代码如下:
public void ConfigureServices(IServiceCollection services){var container = new Container(x =>{x.AddTransient<IDBManager, DBManager>();});services.AddControllersWithViews();}
值得注意的是 Lamar 拥有强大的 自动装配
能力,它可以搜索请求类型和所需类型的构造函数,并构建其需要的实例,下面的代码展示了如何通过 ConfigureContainer()
方法去实现,这里我将该方法放在 Startup
类中,完整代码如下:
public class Startup{// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){var container = new Container(x =>{x.AddTransient<IDBManager, DBManager>();});services.AddControllersWithViews();}public void ConfigureContainer(ServiceRegistry services){services.Scan(s =>{s.TheCallingAssembly();s.WithDefaultConventions();});}}
Controller 中注入 DBManager 实例
接下来就可以在 Controller 中通过依赖注入的方式获取 DBManager 实例啦,实现代码如下:
public class HomeController : Controller{private readonly ILogger<HomeController> _logger;private IDBManager _dbManager;public HomeController(ILogger<HomeController> logger, IDBManager dbManager){_logger = logger;_dbManager = dbManager;}public IActionResult Index(){return View();}}
ASP.Net Core 自带的依赖注入容器放在 IOC 圈子里来说那真是太弱了,太需要第三方来扩充了, Lamar 就是这样一款非常优秀的 IOC 容器,也是 StructureMap 非常好的替代品。
译文链接:https://www.infoworld.com/article/3339698/how-to-use-lamar-in-aspnet-core.html
如何在 ASP.Net Core 中使用 Lamar相关推荐
- 如何在 ASP.NET Core 中使用 HttpClientFactory ?
ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...
- 如何在 ASP.Net Core 中使用 Autofac
依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...
- 如何在 ASP.Net Core 中使用 MediatR
MediatR 是一个 中介者模式 的.NET开源实现, 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖,在 中介者模式 中,一个对象不需要直接和另一个对象进行通讯, ...
- 如何在 ASP.Net Core 中对接 WCF
在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三 ...
- 如何在 ASP.Net Core 中使用 NCache
虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式. 内存缓存 分布式缓存 Response缓存 Alachisoft 公司提供了一个开源项目 NCache, ...
- 如何在 ASP.Net Core 中使用 Configuration Provider
ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配 ...
- 如何在 ASP.Net Core 中使用 Serilog
记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...
- 如何在 ASP.NET Core 中使用 URL Rewriting 中间件
URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...
- 如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度
当我们在web开发中,常常会遇到这么一个需求,在后台执行某一项具体的任务,具体的说就是这些任务必须在后台定时执行. Quartz.NET 是一个开源的 JAVA 移植版,它有着悠久的历史并且提供了强大 ...
最新文章
- Python提升“技术逼格”的6个方法
- 【Python基础】Python开发环境设置和小技巧
- 西安活动 | 2019年1月13号 拥抱开源, 又见.NET 线下交流活动报名进行中
- [html] 如何禁止移动端的左右划动手势?
- c++ class struct同名_C/C++面向对象编程之封装
- Mysql密码加密方式
- 单商户商城系统功能拆解19—订单管理
- Java语言实现矩阵卷积运算
- swagger常用注解汇总
- Django中render、render_to_response、HttpResponse、JsonResponse、Response的使用
- Visual studio2022 利用glfw+glad配置OpenGL环境
- 电脑可以上QQ但是打不开网页
- CSS : 文字彩色抖动效果
- Matlab-LSB信息隐藏实验
- 软件测试自我评价模版,软件测试工程师简历自我评价
- 想凭勤奋逆风翻盘?如今靠运气才有更大赢面
- Linux C中unsigned long与指针的关系
- 30岁+,大龄青年转行程序员的切身经历
- 【转自Mster HaKu的博文】UML设计初步 - 基本概念一(actor, use case)
- 汉语言文学考研学校c等20个,汉语言文学考研江苏省内哪个学校好考
热门文章
- 苹果CMS V10 播放记录_苹果cms整合dplayer播放器增加记忆+P2P播放+自动下一集
- ASP.NET WebApi 基于JWT实现Token签名认证
- ActiveMQ在windows下启动失败解决方案
- SQL中触发器的使用
- nodejs 实践:express 最佳实践(六) express 自省获得所有的路由
- Django Views(视图函数)
- 2017年初随想——几个小目标
- 如何保护你的linux操作系统
- [原]NYOJ-开灯问题-77
- [原]一步一步自己制作弹出框