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应用程序中使用依赖注入的经验和建议. ...
随机推荐
- 《University Calculus》-chaper12-多元函数-拉格朗日乘数法
求解条件极值的方法:拉格朗日乘数法 基于对多元函数极值方法的了解,再具体的问题中我们发现这样一个问题,在求解f(x,y,z)的极值的时候,我们需要极值点落在g(x,y,z)上这种对极值点有约束条件,通 ...
- 跑步进入全站 HTTPS ,这些经验值得你看看
随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站 HTTPS.就在前几天,免费提供证书服务的 Let’s Encrypt 项目也正式开放测试,HTTPS 很快就会成为 WE ...
- 由浅入深吃透MVC框架,驯服烂代码
MVC 已经成为客户端的主流编程框架,相信客户端工程师对它并不陌生,甚至在开发过程中,不通过思考都会自动使用 MVC 框架编程.但在工作过程中,发现许多小伙伴也只是使用 MVC,对于为什么这样使用并不 ...
- A - Til the Cows Come Home
裸的最短路,试一下刚看的spfa,虽然没有看代码,不过明白了大致的思想,先写一下试试吧,而且是个稀疏图,应该会很快吧. SPFA 算法采用图的存储结构是邻接表,方法是动态优化逼近法.算法中设立了一个先 ...
- java中的代理
package cn.itcast.day3; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHan ...
- pull解析和sax解析的差别
假设在一个XML文档中我们仅仅须要前面一部分数据.可是使用SAX方式或DOM方式会对整个文档进行解析,虽然XML文档中后面的大部分数据我们事实上都不须要解析.因此这样实际上就浪费了处理资源. 使用PU ...
- [Angular 2] Exposing component properties to the template
Showing you how you can expose properties on your Controller to access them using #refs inside of yo ...
- 2015移动安全挑战赛(阿里&看雪主办)第一题分析
今天在网上看到了阿里移动安全比赛的第一次,并且说难度不大,便拿来看了看. 主体就是找出一个密码输进去,然后看正误. 这个题是纯Java层的一个题,也没用进行什么保护.可以直接反编译. 登陆Button ...
- svcutil 生成代理类时的问题
如果有这个的xsd, group内嵌choice的结构: <xs:complexType name="CreateType"> <xs:sequen ...
- NYOJ128前缀式计算
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...