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应用程序中使用依赖注入的经验和建议. ...
随机推荐
- 《A First Course in Mathematical Modeling》-chaper1-差分方程建模
从今天开始笔者将通过这个专栏可是对“数学建模”的学习.其实对于“数学建模”自身的内涵或者意义并不需要太多的阐释,下图简洁明了的阐释了数学建模的意义. 其实数学建模本身可以看成换一种角度去解读数学,将我 ...
- u盘启动openwrt
opkg update opkg install kmod-usb-ohci kmod-usb2 kmod-fs-ext3 opkg install kmod-usb-storage reboot m ...
- poj1009
题目大意:边缘检测 IONU卫星成像公司,公司记录和储存非常大的图片使用行程编码,你需要编写一个程序读取被压缩的图像,发现图像的边缘,描述如下,并且输出另一个发现的边缘压缩图像. 一个简单的边缘检测算 ...
- UITableView调优
UITableView的优化主要从三个方面入手: 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法: 异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就 ...
- cookie操作大全
JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...
- mysql 循环插入100w
use md5db; DROP PROCEDURE if exists myFunction; delimiter $$ CREATE PROCEDURE myFunction() BEGIN DEC ...
- JSP基本语法
在tomcat环境搭建一文中为大家详细的介绍了第一个JSP的程序--Hello World,大家都应该顺利的完成了吧,以此为一个开端,希望大家在学习java EE的路上乘风破浪,不断进步.今天,为大家 ...
- LayoutInflater和inflate()方法的使用方法
public static LayoutInflaterfrom(Context context) { LayoutInflaterLayoutInflater = (LayoutInflater)c ...
- Python分类统计数据
在数据的常见分布中,有一种是一对多存储的数据,即一个是key,其他改key对应的多个value.例如气象数据等,每天有很多组,又或者是一个球员,他每天得多少分等等.我做这个东西有三种方法,即:常规编程 ...
- Shell 获取当前时间
#! /bin/bash time=`date '+%Y-%m-%d %H:%M:%S'` # echo $time sql='SELECT `username`, `password` FROM ` ...