net core 依赖注入问题
net core 依赖注入问题
最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列。今天研究的是依赖注入,但是我发现一个问题,困扰我很久,现在我贴出来,希望可以有人帮忙解决或回复一下。
背景:我测试.net自带的依赖注入生命周期,一共三个:Transient、Scope、Single三种,通过一个GUID在界面展示,但是我发现scope和single的每次都是相同的,并且single实例的guid值每次都会改变。
通过截图可以看到scope和Single每次浏览器刷新都会改变,scope改变可以理解,就是每次请求都会改变。但是single 每次都改变就不对了。应该保持一个唯一值才对。
Program.cs代码:启动代码

1 namespace CoreStudy
2 {
3 public class Program
4 {
5 public static void Main(string[] args)
6 {
7 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
8 var host = new WebHostBuilder()
9 .UseKestrel()//使用服务器serve
10 .UseContentRoot(Directory.GetCurrentDirectory())
11 .UseIISIntegration()//使用IIS
12 .UseStartup<Startup>()//使用起始页
13 .Build();//IWebHost
14
15 host.Run();//构建用于宿主应用程序的IWebHost
16 //然后启动它来监听传入的HTTP请求
17 }
18 }
19 }

Startup.cs 文件代码

1 namespace CoreStudy
2 {
3 public class Startup
4 {
5 public Startup(IHostingEnvironment env, ILoggerFactory logger)
6 {
7 var builder = new ConfigurationBuilder()
8 .SetBasePath(env.ContentRootPath)
9 .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
10 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
11 .AddEnvironmentVariables();
12 builder.AddInMemoryCollection();
13
14 }
15 // This method gets called by the runtime. Use this method to add services to the container.
16 // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
17 public void ConfigureServices(IServiceCollection services)
18 {//定义服务
19 services.AddMvc();
20 services.AddLogging();
21 services.AddTransient<IPersonRepository, PersonRepository>();
22 services.AddTransient<IGuidTransientAppService, TransientAppService>();
23
24 services.AddScoped<IGuidScopeAppService, ScopeAppService>();
25
26 services.AddSingleton<IGuidSingleAppService, SingleAppService>();
27 }
28
29 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
30 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifetime)
31 {//定义中间件
32
33 if (env.IsDevelopment())
34 {
35 app.UseDeveloperExceptionPage();
36 app.UseBrowserLink();
37 app.UseDatabaseErrorPage();
38
39 }
40 else
41 {
42 app.UseExceptionHandler("/Home/Error");
43 }
44 app.UseStaticFiles();
45 //app.UseStaticFiles(new StaticFileOptions() {
46 // FileProvider=new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),@"staticFiles")),
47 // RequestPath="/staticfiles"
48 // });
49 //默认路由设置
50 app.UseMvc(routes =>
51 {
52 routes.MapRoute(name: "default", template: "{controller=Person}/{action=Index}/{id?}");
53 });
54
55
56 }
57 }
58 }

请注意22-26行,注册了三种不同生命周期的实例,transientService、scopeService以及singleService。
对应的接口定义:

1 namespace CoreStudy
2 {
3 public interface IGuideAppService
4 {
5 Guid GuidItem();
6 }
7 public interface IGuidTransientAppService:IGuideAppService
8 { }
9 public interface IGuidScopeAppService:IGuideAppService
10 { }
11 public interface IGuidSingleAppService:IGuideAppService
12 { }
13
14 }
15
16 namespace CoreStudy
17 {
18 public class GuidAppService : IGuideAppService
19 {
20 private readonly Guid item;
21 public GuidAppService()
22 {
23 item = Guid.NewGuid();
24 }
25 public Guid GuidItem()
26 {
27 return item;
28 }
29
30 }
31 public class TransientAppService:GuidAppService,IGuidTransientAppService
32 {
33
34 }
35
36 public class ScopeAppService:GuidAppService,IGuidScopeAppService
37 { }
38 public class SingleAppService:GuidAppService,IGuidSingleAppService
39 { }
40 }

代码很简单,只是定义了三种不同实现类。
控制器中 通过构造函数注入方式注入:

1 namespace CoreStudy.Controllers
2 {
3 /// <summary>
4 /// 控制器方法
5 /// </summary>
6 public class PersonController : Controller
7 {
8 private readonly IGuidTransientAppService transientService;
9 private readonly IGuidScopeAppService scopedService;
10 private readonly IGuidSingleAppService singleService;
11
12
13 private IPersonRepository personRepository = null;
14 /// <summary>
15 /// 构造函数
16 /// </summary>
17 /// <param name="repository"></param>
18 public PersonController(IGuidTransientAppService trsn, IGuidScopeAppService scope, IGuidSingleAppService single)
19 {
20 this.transientService = trsn;
21 this.scopedService = scope;
22 this.singleService = single;
23 }
24
25 /// <summary>
26 /// 主页方法
27 /// </summary>
28 /// <returns></returns>
29 public IActionResult Index()
30 {
31 ViewBag.TransientService = this.transientService.GuidItem();
32
33 ViewBag.scopeService = this.scopedService.GuidItem();
34
35 ViewBag.singleservice = this.scopedService.GuidItem();
36
37 return View();
38 }
39
40
41 }
42 }

控制器对应的视图文件Index.cshtm

1 @{
2 ViewData["Title"] = "Person Index";
3 Layout = null;
4 }
5
6 <form asp-controller="person" method="post" class="form-horizontal" role="form">
7 <h4>创建账户</h4>
8 <hr />
9 <div class="row">
10 <div class="col-md-4">
11 <span>TransientService:</span>
12 @ViewBag.TransientService
13 </div>
14 </div>
15 <div class="row">
16 <span>Scope</span>
17 @ViewBag.ScopeService
18 </div>
19 <div class="row">
20 <span>Single</span>
21 @ViewBag.SingleService
22 </div>
23 <div class="col-md-4">
24 @await Component.InvokeAsync("Greeting");
25 </div>
26 </form>

其他无关代码就不粘贴了,希望各位能给个解释,我再看一下代码,是否哪里需要特殊设置。
.Net Core来了,我们又可以通过学习来涨工资了。
net core 依赖注入问题的更多相关文章
- # ASP.NET Core依赖注入解读&使用Autofac替代实现
标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...
- NET Core依赖注入解读&使用Autofac替代实现
NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...
- 实现BUG自动检测 - ASP.NET Core依赖注入
我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...
- [译]ASP.NET Core依赖注入深入讨论
原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...
- asp.net core 依赖注入几种常见情况
先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用 然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例. 参考https://www.cnblo ...
- ASP.NET Core依赖注入——依赖注入最佳实践
在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...
- 自动化CodeReview - ASP.NET Core依赖注入
自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...
- ASP.NET Core 依赖注入最佳实践——提示与技巧
在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...
- ASP.NET Core依赖注入最佳实践,提示&技巧
分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...
随机推荐
- max Sum(简单动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1003 / 给组测试数据 1 7 2 3 -4 -5 6 7 8 一个关键问题 : 什么时候将开始位置重新赋值 即 ...
- hdu 3062 2-sat入门题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 #include <cstdio> #include <cmath> # ...
- Solr系列二:Solr与mmseg4j的整合
mmseg4j是一个很好的中文分词器,solr与mmseg4j的整合也非常简单.如下: 第一步:下载mmseg4j的jar包,网上搜索一下有很多下载地址,如下是csdn上的一个连接:http://do ...
- js标题文字向上滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- dubbo源码分析一:整体分析
本文作为dubbo源码分析的第一章,先从总体上来分析一下dubbo的代码架构.功能及优缺点,注意,本文只分析说明开源版本提供的代码及功能. 1.dubbo的代码架构: spring适配层:常规的sp ...
- 【JS跨域请求】Ajax跨域请求JSONP
前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资料,原来如此... 为何一直知道jsonp,但一直迷迷糊糊的不明白 ...
- 关于URL重写
1. 为什么要使用url重写? 先从session的原理讲起,为什么我们能够获得session中的东西呢?如果没有禁用cookie的话,那么session创建之后,会将session id的值通过r ...
- SQLServer中使用索引视图(物化视图)
物化视图:以前用的普通的视图,普通视图就是一段逻辑语句,对性能没有任何的提升,也不能创建索引,而物化视图会把视图里查询出来的数据在数据库上建立快照,它和物理表一样,可以创建 索引,主键约束等等,性能会 ...
- 用PHP迭代器来实现一个斐波纳契数列(转)
斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...
- 边走边学Nodejs (基础入门篇)
1.什么是Node.js Nodejs ,或者node, 是一个基于ChromeJavaScript执行时建立的平台.用于方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动, 非堵 ...