更新 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";
}
}

最新文章

  1. java关键包简易说明
  2. 使用MacBook Air的4项基本技巧
  3. G-nav-01
  4. java开发微信公众平台备忘
  5. WinHex分析PE格式(2)&amp;&amp; 如何手动添加区段并运行区段
  6. android studio简易了解第一部分
  7. zkclient中包引用不对,导致NoSuchMethodError
  8. Scala 特质全面解析
  9. Java字节码浅析(二)
  10. js监控鼠标滚动事件
  11. Tomcat通过Memcached实现session共享的完整部署记录
  12. .NetCore 下开发独立的(RPL)含有界面的组件包 (一)准备工作
  13. Web侦察工具HTTrack (爬取整站)
  14. 自定义 vim
  15. Cracking The Coding Interview2.3
  16. iPhone跳转的动画效果类型及实现方法 CATransition
  17. 秒杀多线程第六篇 经典线程同步 事件Event
  18. java数据结构链表(纯面向对象的方式)
  19. linq 获取实体列表中的某个字段返回ilist&lt;string&gt;
  20. 关于Hibernate中的临时态, 持久态, 游离态

热门文章

  1. Lyft高管的技术团队管理实战
  2. 关于innodb_flush_log_at_trx_commit、innodb_flush_method、innodb_log_block_size和fsync()、O_DIRECT、iops、云盘的关系与总结
  3. 【4opencv】CLR基本原理和如何运用于GOCW
  4. rpm command
  5. 从输入URL到页面显示发生了什么
  6. 做了一道cf水题
  7. Ubuntu 18.04 休眠后无法唤醒的解决办法
  8. Elasticsearch--&gt;Get Started--&gt;Modifying Your Data
  9. 解决: docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
  10. vue.js精讲02