博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.net core 学习笔记 ( DI 依赖注入 )
阅读量:6677 次
发布时间:2019-06-25

本文共 3183 字,大约阅读时间需要 10 分钟。

更新 2019-05-06 

用泛型来传 class, 这样比较方便扩展

services.AddEmail
();services.AddEmail
();

AddEmail 

public static class ServiceCollectionExtensions{    public static IServiceCollection AddEmail
( 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
(Configuration.GetSection("business")); services.Configure
(Configuration.GetSection("email")); services.AddEmail(); // Razor template services.AddSingleton
(); services.AddSingleton
(); // Entity services.AddScoped(_ => new DB(Configuration.GetConnectionString("DefaultConnection"))); // hangfire services.AddHangfire(config => config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection"))); // MVC services.Configure
(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
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
(); services.AddSingleton
(); services.AddScoped
(); return services; } } public class EmailService { public EmailService() { } public string name { get; set; } = "dada"; }}

 

转载于:https://www.cnblogs.com/keatkeat/p/7742543.html

你可能感兴趣的文章
JSON格式自动解析遇到的调用方法问题.fromJson() ..readValue()
查看>>
Crystal Reports for Visual Studio 2015 安装
查看>>
iOS UI 15 网络编程下载 图片 音乐 大文件 视频 get/ post方法
查看>>
linux文件系统 - 初始化(二)
查看>>
Python的可视化图表工具集
查看>>
《条目二十九:对于逐个字符的输入请考虑istreambuf_iterator》
查看>>
三个文件,
查看>>
webpack的总结
查看>>
hibernate 一级缓存和二级缓存
查看>>
javac不是内部或外部命令
查看>>
mvc SelectList selected失效的解决方法
查看>>
JAVA 设计模式 中介者模式
查看>>
我的软件工程课目标
查看>>
var a={n:1}; var b=a; a.x=a={n:2}; console.log(a.x); console.log(b.x);
查看>>
【HDOJ】3016 Man Down
查看>>
window.open打开新页面,并将本页数据用过url传递到打开的页面;需要两个页面;...
查看>>
查看本机IP分为两种情况:
查看>>
Scala进阶之路-Scala特征类与unapply反向抽取
查看>>
洛谷P3057 [USACO12NOV]远处的牧场Distant Pastures
查看>>
hdu3415 Max Sum of Max-K-sub-sequence 单调队列
查看>>