Asp.net core 学习笔记 ( DI 依赖注入 )
2024-10-11 03:22:56
更新 2020-01-11
动态创建 class 并且可以使用 DI, 这样反射样就可以了
var instance = ActivatorUtilities.CreateInstance<AbcService>(serviceProvider);
更新 2019-05-06
用泛型来传 class, 这样比较方便扩展
services.AddEmail<EmailService>();
services.AddEmail<NewEmailService>();
AddEmail
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddEmail<TEmailService>(
this IServiceCollection services
)
where TEmailService : IEmailService
{
services.AddScoped(typeof(IEmailService), typeof(TEmailService));
return services;
}
} public interface IEmailService
{
string GetValue();
} public class EmailService : IEmailService
{
public string GetValue()
{
return "email v1";
}
} public class NewEmailService : IEmailService
{
public string GetValue()
{
return "email v2";
}
}
比起 Angular 的依赖注入, core 的相对简单许多, 容易明白
所有 provider 都在 startup 里配置.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Business>(Configuration.GetSection("business"));
services.Configure<Configuration.Email>(Configuration.GetSection("email")); services.AddEmail();
// Razor template
services.AddSingleton<ICompositeViewEngine, CompositeViewEngine>();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>(); // Entity
services.AddScoped(_ => new DB(Configuration.GetConnectionString("DefaultConnection"))); // hangfire
services.AddHangfire(config =>
config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection"))); // MVC
services.Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationExpanders.Add(new FeatureLocationExpander());
});
services.AddMvc();
}
controller 就通过 constructor 来注入就可以了.
private readonly DB db;
private ICompositeViewEngine CompositeViewEngine { get; set; }
private ActionContext ActionContext { get; set; }
private IServiceProvider ServiceProvider { get; set; }
private ITempDataProvider TempDataProvider { get; set; }
private Configuration.Email EmailConfig { get; set; } public DebugController(
DB db,
ICompositeViewEngine compositeViewEngine,
IActionContextAccessor actionContextAccessor,
IServiceProvider serviceProvider,
ITempDataProvider tempDataProvider,
IOptionsSnapshot<Configuration.Email> emailOptionsAccessor
)
{
CompositeViewEngine = compositeViewEngine;
ActionContext = actionContextAccessor.ActionContext;
ServiceProvider = serviceProvider;
TempDataProvider = tempDataProvider;
EmailConfig = emailOptionsAccessor.Value;
this.db = db;
}
provider 有 3 个级别
AddSingleton
AddScoped
AddTransient
单列是说整个 App 用一个实例
Scope 一个 request 一个实例
transient 则是每一个注入一个实例
一个模块一般上会提供好多 Service
那么要让 startup 干净一些的话,我们可以包装起来
就好像这样 services.AddEmail();
做法是开一个扩展方法
namespace Project.Email
{
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddEmail(
this IServiceCollection services)
{
services.AddSingleton<ICompositeViewEngine, CompositeViewEngine>();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<EmailService, EmailService>();
return services;
}
} public class EmailService
{
public EmailService()
{ } public string name { get; set; } = "dada";
}
}
最新文章
- java关键包简易说明
- 使用MacBook Air的4项基本技巧
- G-nav-01
- java开发微信公众平台备忘
- WinHex分析PE格式(2)&;&; 如何手动添加区段并运行区段
- android studio简易了解第一部分
- zkclient中包引用不对,导致NoSuchMethodError
- Scala 特质全面解析
- Java字节码浅析(二)
- js监控鼠标滚动事件
- Tomcat通过Memcached实现session共享的完整部署记录
- .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作
- Web侦察工具HTTrack (爬取整站)
- 自定义 vim
- Cracking The Coding Interview2.3
- iPhone跳转的动画效果类型及实现方法 CATransition
- 秒杀多线程第六篇 经典线程同步 事件Event
- java数据结构链表(纯面向对象的方式)
- linq 获取实体列表中的某个字段返回ilist<;string>;
- 关于Hibernate中的临时态, 持久态, 游离态
热门文章
- Lyft高管的技术团队管理实战
- 关于innodb_flush_log_at_trx_commit、innodb_flush_method、innodb_log_block_size和fsync()、O_DIRECT、iops、云盘的关系与总结
- 【4opencv】CLR基本原理和如何运用于GOCW
- rpm command
- 从输入URL到页面显示发生了什么
- 做了一道cf水题
- Ubuntu 18.04 休眠后无法唤醒的解决办法
- Elasticsearch-->;Get Started-->;Modifying Your Data
- 解决: docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
- vue.js精讲02