1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > asp.net core 依赖注入问题

asp.net core 依赖注入问题

时间:2021-10-11 19:26:48

相关推荐

asp.net core 依赖注入问题

最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列。今天研究的是依赖注入,但是我发现一个问题,困扰我很久,现在我贴出来,希望可以有人帮忙解决或回复一下。

背景:我测试.net自带的依赖注入生命周期,一共三个:Transient、Scope、Single三种,通过一个GUID在界面展示,但是我发现scope和single的每次都是相同的,并且single实例的guid值每次都会改变。

通过截图可以看到scope和Single每次浏览器刷新都会改变,scope改变可以理解,就是每次请求都会改变。但是single 每次都改变就不对了。应该保持一个唯一值才对。

Program.cs代码:启动代码

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

Startup.cs 文件代码

1 namespace CoreStudy 2 { 3public 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 /fwlink/?LinkID=39894017 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 else41 {42 app.UseExceptionHandler("/Home/Error");43 }44 app.UseStaticFiles();45 //app.UseStaticFiles(new StaticFileOptions() {46 //FileProvider=new PhysicalFileProvider(bine(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 { 3public interface IGuideAppService 4{ 5 Guid GuidItem(); 6} 7public interface IGuidTransientAppService:IGuideAppService 8{ } 9public interface IGuidScopeAppService:IGuideAppService10{ }11public interface IGuidSingleAppService:IGuideAppService12{ }13 14 }15 16 namespace CoreStudy17 {18public class GuidAppService : IGuideAppService19{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}31public class TransientAppService:GuidAppService,IGuidTransientAppService32{33 34}35 36public class ScopeAppService:GuidAppService,IGuidScopeAppService37{ }38public class SingleAppService:GuidAppService,IGuidSingleAppService39{ }40 }

代码很简单,只是定义了三种不同实现类。

控制器中 通过构造函数注入方式注入:

1 namespace CoreStudy.Controllers 2 { 3/// <summary> 4/// 控制器方法 5/// </summary> 6public 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 @{ 2ViewData["Title"] = "Person Index"; 3Layout = 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.TransientService13 </div> 14 </div>15<div class="row">16 <span>Scope</span>17 @ViewBag.ScopeService18</div>19<div class="row">20 <span>Single</span>21 @ViewBag.SingleService22</div>23<div class="col-md-4">24 @await Component.InvokeAsync("Greeting");25</div>26 </form>

其他无关代码就不粘贴了,希望各位能给个解释,我再看一下代码,是否哪里需要特殊设置。

答案在PersonController 类的 35行,此问题主要是为了能够更好的理解依赖注入

.Net Core来了,我们又可以通过学习来涨工资了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。