ASP.NET Core中的依赖注入
2021-04-14 10:26
标签:有一个 absolute 直接 ntop injection await ecif 特定 private ASP.NET Core支持DI软件设计模式,其是一种为了在类及其依赖对象之间实现控制反转(IoC)的一项技术。获取更多特定于MVC控制器的依赖注入的信息,可以参考Dependency injection into controllers in ASP.NET Core。 依赖注入概述 任何其他对象需要的一个对象都可以称之为依赖。检查如下具有一个 我们可以创建一个 这个类创建并直接依赖于 依赖注入通过以下方式解决这些问题: 在示例代码中, 一个具体类型 容器通过使用(generic) open types来对 在示例代码中,使用具体类型 注意,每一个 如果服务的构造函数需要一个内置类型,比如String,那么可以使用配置或者选项模式进行注入: 服务实例被使用它的类的构造函数所请求并被分配给一个私有字段。在整个类中,便可以使用这个字段来访问服务。 在示例代码中, ASP.NET Core中的依赖注入 标签:有一个 absolute 直接 ntop injection await ecif 特定 private 原文地址:https://www.cnblogs.com/qianxingmu/p/12376397.htmlWriteMessage
方法的MyDependency
类,app中的其他类会依赖它:public class MyDependency
{
public MyDependency()
{
}
public Task WriteMessage(string message)
{
Console.WriteLine(
$"MyDependency.WriteMessage called. Message: {message}");
return Task.FromResult(0);
}
}
MyDependency
类的实例来使得WriteMessage
方法对于一个类是可用的。如下所示,MyDependency
类便是IndexModel类的一个依赖:
public class IndexModel : PageModel
{
MyDependency _dependency = new MyDependency();
public async Task OnGetAsync()
{
await _dependency.WriteMessage(
"IndexModel.OnGetAsync created this message.");
}
}
MyDependency
类的实例。代码依赖(正如上述代码)是有问题的,基于如下理由,我们应该避免它:
MyDependency
,使用了MyDependency
的所有类必须要进行改动。MyDependency
类也具有依赖,那么MyDependency
类的使用类必须对它们进行配置,会使得配置代码散布在整个app中。MyDependency
类来进行单元测试,但在这种模式下这是不可能的。
Startup.ConfigureServices
方法中进行注册。IMyDependency
接口定义了服务提供给app的方法:public interface IMyDependency
{
Task WriteMessage(string message);
}
MyDependency
实现了这个接口:public class MyDependency : IMyDependency
{
private readonly ILogger
MyDependency
在其构造函数中 请求了一个ILoggerIMyDependency以及
ILogger
必须在服务容器中进行注册。IMyDependency
在Startup.ConfigureServices
中进行注册;而日志抽象架构负责ILogger
ILogger
进行解析,而不需要对每一个泛型构造类型进行注册:services.AddSingleton(typeof(ILogger), typeof(Logger));
MyDependency
来对IMyDependency
服务进行注册。这个注册将服务的生命周期限定为一个请求的生命周期,服务的生命周期会在后续进行讨论:public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddScoped
services.Add{SERVICE_NAME}扩展方法都会添加(并潜在配置)了服务。比如
services.AddMvc()
添加了Razor视图和MVC支持。我们建议app遵从此约定,将扩展方法放置在此命名空间Microsoft.Extensions.DependencyInjection以对服务注册的分组进行封装。public class MyDependency : IMyDependency
{
public MyDependency(IConfiguration config)
{
var myStringValue = config["MyStringKey"];
// Use myStringValue
}
...
}
IMyDependency
的实例会被请求并用来调用服务的WriteMessage
方法。public class IndexModel : PageModel
{
private readonly IMyDependency _myDependency;
public IndexModel(
IMyDependency myDependency,
OperationService operationService,
IOperationTransient transientOperation,
IOperationScoped scopedOperation,
IOperationSingleton singletonOperation,
IOperationSingletonInstance singletonInstanceOperation)
{
_myDependency = myDependency;
OperationService = operationService;
TransientOperation = transientOperation;
ScopedOperation = scopedOperation;
SingletonOperation = singletonOperation;
SingletonInstanceOperation = singletonInstanceOperation;
}
public OperationService OperationService { get; }
public IOperationTransient TransientOperation { get; }
public IOperationScoped ScopedOperation { get; }
public IOperationSingleton SingletonOperation { get; }
public IOperationSingletonInstance SingletonInstanceOperation { get; }
public async Task OnGetAsync()
{
await _myDependency.WriteMessage(
"IndexModel.OnGetAsync created this message.");
}
}