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应用程序中使用依赖注入的经验和建议. ...
随机推荐
- [Locked] Zigzag Iterator
Zigzag Iterator Given two 1d vectors, implement an iterator to return their elements alternately. Fo ...
- 总结&计划
最近完成的事儿: 1. 看完了<c专家编程>并且整理了读书笔记 2. 看了半章<大数据>发现这本书里面是纯纯的干货...习题需要认真做,算法需要仔细体会...不适合突击,尤其是 ...
- 【bzoj2333】 SCOI2011—棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 (题目链接) 题意 N个节点维护一些操作.. Solution 我们用可并大根堆进行维护. 对 ...
- TI C66x DSP 系统events及其应用 - 5.10(创建ISR的三种情况)
ISFP是服务中断的指令包,创建ISR的三种情况: 1.一个ISFP包的8条指令就能够满足ISR watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWl5ZW ...
- RESTEasy + JBOSS 7 Hello world application---reference
RESTEasy is JBOSS provided implementation of JAX-RS specification for building RESTful Web Services ...
- [转] Boost智能指针——scoped_ptr
http://www.cnblogs.com/tianfang/archive/2008/09/15/1291050.html boost::scoped_ptr和std::auto_ptr非常类似, ...
- [转] Linux中gcc,g++常用编译选项
http://blog.sina.com.cn/s/blog_5ff2a8a201011ro8.html gcc/g++ 在执行编译时,需要4步 1.预处理,生成.i的文件[使用-E参数] 2.将预处 ...
- EventLoop的设计
1. Event Loop作为一个IO线程,通过IO复用来处理事件 2. 为了保证线程安全,任何需要修改IO线程资源的工作都交给IO线程亲自来做 3. 为了IO线程与其他线程互调,需要设计一个even ...
- Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)
一. 移动支付: 用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...
- CSS 让标点符号不出现在行首
word-break:break-all; 这条语句的作用是让语句到达边界的时候自动换行,但是正是这个样式让标点符号跑到了行首. 语法: word-break : normal | break-all ...