ASP.Net Core内置了对依赖项注入的支持。 实际上,ASP.Net Core开箱即用地带有一个简约的依赖项注入容器。 但是,您也可以在ASP.Net Core中使用第三方依赖项注入容器。
依赖注入是一种设计模式,可促进松散耦合并促进可测试性和维护性。 您可以利用依赖项注入来改进实现,而不必更改使用这些实现的类或接口。
Lamar是流行的控制反转(IoC)容器StructureMap的快速,现代化的后续产品。 本文讨论了如何在ASP.Net Core中使用Lamar。
为什么要使用Lamar进行依赖注入
StructureMap的主要缺点是性能。 Lamar轻巧且快速。 Lamar还具有功能强大的API,使您能够轻松地探索和利用其功能。 Lamar API与StructureMap相似,因此,如果您过去曾使用过StructureMap,则可以轻松使用Lamar。
在ASP.Net Core中设置Lamar非常容易。 我们只需要从NuGet安装必要的程序包,在Program.cs中指定引导代码,然后在Startup.cs文件中添加必要的依赖项,就如同使用ASP.Net Core的默认依赖项注入容器一样。
创建一个ASP.Net Core项目
首先,让我们创建一个ASP.Net Core项目。 如果您的系统已启动并运行Visual Studio 2017,请按照以下步骤在Visual Studio中创建一个新的ASP.Net Core项目。
- 启动Visual Studio 2017 IDE。
- 单击文件>新建>项目。
- 从显示的模板列表中选择“ ASP.Net Core Web应用程序(.Net Core)”。
- 指定项目的名称。
- 单击确定保存项目。
- 接下来显示一个新窗口“ New .Net Core Web Application…”。
- 选择.Net Core作为运行时,并从顶部的下拉列表中选择ASP.Net Core 2.2(或更高版本)。
- 选择API作为项目模板。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
- 确保选择“无身份验证”,因为我们也不会使用身份验证。
- 单击确定。
这将在Visual Studio中创建一个新的ASP.NET Core项目。 接下来,我们应该安装必要的NuGet软件包,以便在该项目中使用Lamar。
安装Lamar NuGet软件包
要在ASP.Net Core中使用Lamar,您需要在项目中安装Lamar和Lamar.Microsoft.DependencyInjection程序包。 要安装这些软件包,请在“解决方案资源管理器”窗口中右键单击该项目,然后选择“管理NuGet软件包...”。 然后,您可以搜索这些软件包,然后单击“安装”。

在ASP.Net Core中使用Lamar所需的两个软件包是Lamar和Lamar.Microsoft.DependencyInjection。
使用NuGet软件包管理器安装这些软件包的替代方法是使用NuGet软件包管理器控制台窗口。 要使用NuGet软件包管理器控制台窗口安装这些软件包,请在控制台中依次输入以下命令。
Install-Package Lamar -Version 2.1.0
Install-Package Lamar.Microsoft.DependencyInjection -Version 2.1.0
创建IDBManager和DBManager类型
在本节中,我们将创建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 here
return true;
}
}
我们将在本文后面利用IDBManager接口注入依赖项。
在ASP.Net Core中配置Lamar
包Lamar.Microsoft.DependencyInjection公开了一个称为UseLamar的扩展方法。 调用此扩展方法是为了将Lamar引入应用程序的基础结构。 请参考下面的代码清单,该清单说明了如何实现此目的。
var builder = new WebHostBuilder();
builder.UseLamar()
.UseUrls("http://localhost:50533")
.UseKestrel()
.UseStartup<Startup>();
builder.Start();
接下来,打开文件Program.cs。 下面的代码片段显示了此文件的初始内容,我们将在下一步中对其进行更改。 请注意,当您创建ASP.Net Core项目时,该文件由运行时自动创建。
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
现在,用以下代码替换Program类的源代码(默认情况下,如上所示生成),以引导IWebHostBuilder对象。
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args)
.UseLamar()
.UseUrls("http://localhost:50533")
.Build()
.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
在ASP.Net Core中引导Lamar容器
接下来,可以在Startup类的ConfigureServices方法中将服务添加到管道,如下所示。
public void ConfigureServices(IServiceCollection services)
{
var container = new Container(x =>
{
x.AddTransient<IDBManager, DBManager>();
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
借助Lamar中的Auto Wiring支持,Lamar可以搜索所需类型和所需类型的构造函数,并构建实例。 下面显示的ConfigureContainer方法说明了如何实现此目的。
public void ConfigureContainer(ServiceRegistry services)
{
services.Scan(s =>
{
s.TheCallingAssembly();
s.WithDefaultConventions();
});
}
通过依赖项注入在Controller方法中使用DBManager实例
而且,就是这样! 现在,您可以在控制器类中利用DBManager实例。 为此,请右键单击您先前创建的ASP.Net Core项目的Controllers解决方案文件夹。 接下来,将生成的代码替换为以下代码。
[Route("api/[controller]")]
[ApiController]
public class DefaultController : ControllerBase
{
private IDBManager _dbManager;
public DefaultController(IDBManager dbManager)
{
_dbManager = dbManager;
}
//Other controller methods
}
ASP.Net Core带有开箱即用的内置依赖项注入容器,但功能有限。 您也可以在ASP.Net Core中轻松使用第三方容器。 Lamar就是这样的一个IoC容器,它是StructureMap IoC容器的快速替代品。
From: https://www.infoworld.com/article/3339698/how-to-use-lamar-in-aspnet-core.html