依赖注入
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[ASP.NET Core Web]]
&color(red){※This article is based on .NET 7};
#contents
控制反转是一种思想,依赖注入是一种设计模式,控制反转的思...
* 什么是DI [#w1d47e17]
Dependency Injection(DI)依赖关系注入是IoC的一种具体实现...
ASP.NET Core中的DI容器可以帮助我们解决应用程序中的对象管...
DI要做的两个功能是:
- 注册服务
- 注入服务
若要利用 .NET Core DI 框架,你只需引用 Microsoft.Extnesio...
如下应用程序代码获得了一个实例:
ILoggingFactory loggingFactor = serviceProvider.GetServi...
* DI容器的注册 [#g75a14d1]
注册后可以在整个Solution调用
** 注册的概要 [#of8aa89f]
Asp.Net Core 提供了默认的依赖注入(DI:Dependency Injecti...
在ASP.NET Core中,我们使用ServiceCollection容器来注册服务...
ServiceCollection会在构建出ServiceProvider容器之前验证注...
ServiceCollection.BuildServiceProvider() 方法中,容器将递...
IServiceCollection依赖注入生命周期和其他大多数依赖注入容...
- Transient瞬时生命周期,Transient服务在每次被请求时都会...
- Singleton单例:生命能够周期服务在第一被请求时创建,在后...
- Scoped请求单例:Scoped生命周期的服务是每次web请求被创建...
我们可以在Startup.cs文件中的ConfigureServices方法中直接使...
这里我们单独把它拿出来看一下具体怎么使用,我们定义ITestSe...
#codeprettify{{
IServiceCollection container = new ServiceCollection();
container.AddTransient<ITestService1, TestService1>();//...
container.AddSingleton<ITestService2, TestService2>();//...
container.AddScoped<ITestService3, TestService3>();//请求...
container.AddSingleton<ITestService4>(new TestService4())...
var provider = container.BuildServiceProvider();
ITestService1 testService1 = provider.GetService<ITestSer...
ITestService1 testService2 = provider.GetService<ITestSer...
Console.WriteLine(object.ReferenceEquals(testService1, te...
ITestService2 testService2_1 = provider.GetService<ITestS...
ITestService2 testService2_2 = provider.GetService<ITestS...
Console.WriteLine(object.ReferenceEquals(testService2_1, ...
ITestService3 testService3_1 = provider.GetService<ITestS...
ITestService3 testService3_2 = provider.GetService<ITestS...
Console.WriteLine(object.ReferenceEquals(testService3_1, ...
var scope1 = provider.CreateScope();
var scope2 = provider.CreateScope();
ITestService3 testService3_3 = scope1.ServiceProvider.Get...
ITestService3 testService3_4 = scope2.ServiceProvider.Get...
Console.WriteLine(object.ReferenceEquals(testService3_3, ...
ITestService4 testService4_1 = provider.GetService<ITestS...
ITestService4 testService4_2 = provider.GetService<ITestS...
Console.WriteLine(object.ReferenceEquals(testService4_1, ...
}}
定义一个Service
#codeprettify{{
public class OrderService : IOrderService
{
private string guid;
public OrderService()
{
guid = $"时间:{DateTime.Now}, guid={ Guid.NewGuid...
}
public override string ToString()
{
return guid;
}
}
public interface IOrderService
{
}
}}
注入
#codeprettify{{
public class Startup
{
public void ConfigureServices(IServiceCollection serv...
{
services.AddControllers();
//三种方式注入
services.AddSingleton<IOrderService, OrderService...
services.AddScoped<IOrderService, OrderService>();
services.AddTransient<IOrderService, OrderService...
}
}
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
IOrderService orderService1;
IOrderService orderService2;
public WeatherForecastController(IOrderService orderS...
{
this.orderService1 = orderService1;
this.orderService2 = orderService2;
}
[HttpGet]
public string Get()
{
Debug.WriteLine($"{this.orderService1}\r\n{this.o...
return "helloworld";
}
}
}}
然后画面刷新三次,得到下面的结果
&ref(netcore_DI1.jpg);
** 注册服务的标准实现 [#z26c208b]
就从startup.cs中的ConfigureServices方法说起,先来看下定义...
#codeprettify{{
public virtual void ConfigureServices (Microsoft.Extensio...
}}
* 注入服务 [#q41fb691]
在 ASP.NET Core 中将依赖项注入到控制器
#codeprettify{{
internal class ModuleInit : IModuleInitializer
{
public void Initialize(IServiceCollection services)
{
services.AddScoped<ClassOne>();
}
}
}}
** 构造函数注入 [#p06a0e26]
在 ASP.NET Core 中将依赖项注入到控制器
服务作为构造函数参数添加,并且运行时从服务容器中解析服务...
以下接口公开 IDateTime 服务:
#codeprettify{{
public interface IDateTime
{
DateTime Now { get; }
}
}}
以下代码实现 IDateTime 接口:
#codeprettify{{
public class SystemDateTime : IDateTime
{
public DateTime Now
{
get { return DateTime.Now; }
}
}
}}
将服务添加到服务容器中:
#codeprettify{{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IDateTime, SystemDateTime>();
services.AddControllersWithViews();
}
}}
以下代码根据一天中的时间向用户显示问候语:
#codeprettify{{
public class HomeController : Controller
{
private readonly IDateTime _dateTime;
public HomeController(IDateTime dateTime)
{
_dateTime = dateTime;
}
public IActionResult Index()
{
var serverTime = _dateTime.Now;
if (serverTime.Hour < 12)
{
ViewData["Message"] = "It's morning here - Go...
}
else if (serverTime.Hour < 17)
{
ViewData["Message"] = "It's afternoon here - ...
}
else
{
ViewData["Message"] = "It's evening here - Go...
}
return View();
}
}}
** 批量注入 [#eed0f44f]
#codeprettify{{
private void RegisterService(IServiceCollection services)
{
var assembly = Assembly.Load("SmartPro.Admin.Logic");
var allTypes = assembly.GetTypes();
foreach (var type in allTypes)
{
services.AddSingleton(type);
}
}
}}
* 第三方 [#a2199a8e]
AutoFac也是个容器,下面在Core中把AutoFac整合进来。
在Nuget中添加AutoFac
AutoFac支持AOP
#hr();
コメント:
#comment_kcaptcha
終了行:
[[ASP.NET Core Web]]
&color(red){※This article is based on .NET 7};
#contents
控制反转是一种思想,依赖注入是一种设计模式,控制反转的思...
* 什么是DI [#w1d47e17]
Dependency Injection(DI)依赖关系注入是IoC的一种具体实现...
ASP.NET Core中的DI容器可以帮助我们解决应用程序中的对象管...
DI要做的两个功能是:
- 注册服务
- 注入服务
若要利用 .NET Core DI 框架,你只需引用 Microsoft.Extnesio...
如下应用程序代码获得了一个实例:
ILoggingFactory loggingFactor = serviceProvider.GetServi...
* DI容器的注册 [#g75a14d1]
注册后可以在整个Solution调用
** 注册的概要 [#of8aa89f]
Asp.Net Core 提供了默认的依赖注入(DI:Dependency Injecti...
在ASP.NET Core中,我们使用ServiceCollection容器来注册服务...
ServiceCollection会在构建出ServiceProvider容器之前验证注...
ServiceCollection.BuildServiceProvider() 方法中,容器将递...
IServiceCollection依赖注入生命周期和其他大多数依赖注入容...
- Transient瞬时生命周期,Transient服务在每次被请求时都会...
- Singleton单例:生命能够周期服务在第一被请求时创建,在后...
- Scoped请求单例:Scoped生命周期的服务是每次web请求被创建...
我们可以在Startup.cs文件中的ConfigureServices方法中直接使...
这里我们单独把它拿出来看一下具体怎么使用,我们定义ITestSe...
#codeprettify{{
IServiceCollection container = new ServiceCollection();
container.AddTransient<ITestService1, TestService1>();//...
container.AddSingleton<ITestService2, TestService2>();//...
container.AddScoped<ITestService3, TestService3>();//请求...
container.AddSingleton<ITestService4>(new TestService4())...
var provider = container.BuildServiceProvider();
ITestService1 testService1 = provider.GetService<ITestSer...
ITestService1 testService2 = provider.GetService<ITestSer...
Console.WriteLine(object.ReferenceEquals(testService1, te...
ITestService2 testService2_1 = provider.GetService<ITestS...
ITestService2 testService2_2 = provider.GetService<ITestS...
Console.WriteLine(object.ReferenceEquals(testService2_1, ...
ITestService3 testService3_1 = provider.GetService<ITestS...
ITestService3 testService3_2 = provider.GetService<ITestS...
Console.WriteLine(object.ReferenceEquals(testService3_1, ...
var scope1 = provider.CreateScope();
var scope2 = provider.CreateScope();
ITestService3 testService3_3 = scope1.ServiceProvider.Get...
ITestService3 testService3_4 = scope2.ServiceProvider.Get...
Console.WriteLine(object.ReferenceEquals(testService3_3, ...
ITestService4 testService4_1 = provider.GetService<ITestS...
ITestService4 testService4_2 = provider.GetService<ITestS...
Console.WriteLine(object.ReferenceEquals(testService4_1, ...
}}
定义一个Service
#codeprettify{{
public class OrderService : IOrderService
{
private string guid;
public OrderService()
{
guid = $"时间:{DateTime.Now}, guid={ Guid.NewGuid...
}
public override string ToString()
{
return guid;
}
}
public interface IOrderService
{
}
}}
注入
#codeprettify{{
public class Startup
{
public void ConfigureServices(IServiceCollection serv...
{
services.AddControllers();
//三种方式注入
services.AddSingleton<IOrderService, OrderService...
services.AddScoped<IOrderService, OrderService>();
services.AddTransient<IOrderService, OrderService...
}
}
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
IOrderService orderService1;
IOrderService orderService2;
public WeatherForecastController(IOrderService orderS...
{
this.orderService1 = orderService1;
this.orderService2 = orderService2;
}
[HttpGet]
public string Get()
{
Debug.WriteLine($"{this.orderService1}\r\n{this.o...
return "helloworld";
}
}
}}
然后画面刷新三次,得到下面的结果
&ref(netcore_DI1.jpg);
** 注册服务的标准实现 [#z26c208b]
就从startup.cs中的ConfigureServices方法说起,先来看下定义...
#codeprettify{{
public virtual void ConfigureServices (Microsoft.Extensio...
}}
* 注入服务 [#q41fb691]
在 ASP.NET Core 中将依赖项注入到控制器
#codeprettify{{
internal class ModuleInit : IModuleInitializer
{
public void Initialize(IServiceCollection services)
{
services.AddScoped<ClassOne>();
}
}
}}
** 构造函数注入 [#p06a0e26]
在 ASP.NET Core 中将依赖项注入到控制器
服务作为构造函数参数添加,并且运行时从服务容器中解析服务...
以下接口公开 IDateTime 服务:
#codeprettify{{
public interface IDateTime
{
DateTime Now { get; }
}
}}
以下代码实现 IDateTime 接口:
#codeprettify{{
public class SystemDateTime : IDateTime
{
public DateTime Now
{
get { return DateTime.Now; }
}
}
}}
将服务添加到服务容器中:
#codeprettify{{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IDateTime, SystemDateTime>();
services.AddControllersWithViews();
}
}}
以下代码根据一天中的时间向用户显示问候语:
#codeprettify{{
public class HomeController : Controller
{
private readonly IDateTime _dateTime;
public HomeController(IDateTime dateTime)
{
_dateTime = dateTime;
}
public IActionResult Index()
{
var serverTime = _dateTime.Now;
if (serverTime.Hour < 12)
{
ViewData["Message"] = "It's morning here - Go...
}
else if (serverTime.Hour < 17)
{
ViewData["Message"] = "It's afternoon here - ...
}
else
{
ViewData["Message"] = "It's evening here - Go...
}
return View();
}
}}
** 批量注入 [#eed0f44f]
#codeprettify{{
private void RegisterService(IServiceCollection services)
{
var assembly = Assembly.Load("SmartPro.Admin.Logic");
var allTypes = assembly.GetTypes();
foreach (var type in allTypes)
{
services.AddSingleton(type);
}
}
}}
* 第三方 [#a2199a8e]
AutoFac也是个容器,下面在Core中把AutoFac整合进来。
在Nuget中添加AutoFac
AutoFac支持AOP
#hr();
コメント:
#comment_kcaptcha
ページ名: