Nancy: Nancy/TinyIoc์—์„œ IOptions ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

์— ๋งŒ๋“  2016๋…„ 01์›” 25์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: NancyFx/Nancy

NancyFX/TinyIOC๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์˜ต์…˜ ํŒจํ„ด(https://docs.asp.net/en/latest/fundamentals/configuration.html#options-config-objects ๊ถŒ์žฅ)์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผํ•˜๊ณ ์žˆ๋Š”.

Startup.cs/ConfigureServices ๋ฉ”์„œ๋“œ์— ์˜ต์…˜์„ ๋“ฑ๋กํ•˜๊ณ  ์žˆ์ง€๋งŒ TinyIoc ํด๋ž˜์Šค์— ์„ค์ •์„ ์‚ฝ์ž…ํ•˜๋ ค๊ณ  ํ•˜๋ฉด Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: AppSettings๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ ํŒจํ„ด์ด Microsoft.Extensions.DependencyInjection์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ Nancy๊ฐ€ TinyIoc์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ TinyIoc์ด IOptions๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

TinyIoc๊ณผ ํ•จ๊ป˜ IOptions<>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ตœ์•…์˜ ๊ฒฝ์šฐ TinyIoc์„ MS DependencyInjection์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

MyService.cs:

public SearchService(IOptions<AppSettings> config)
{
}

์˜ค๋ฅ˜:

Application startup exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Something went wrong when trying to satisfy one of the dependencies during composition, make sure that you've registered all new dependencies in the container and inspect the innerexception for more details. ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.NancyEngine ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.DefaultRequestDispatcher ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.DefaultRouteResolver ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.RouteCache ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: MyProject.MyService ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Microsoft.Extensions.OptionsModel.IOptions 1[[MyProject.AppSettings, MyProject, ๋ฒ„์ „=1.0.0.0, ๋ฌธํ™”=์ค‘๋ฆฝ, PublicKeyToken=null]]``

์ถ”๊ฐ€ ์ •๋ณด:

"dependencies": {
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.Owin": "1.0.0-rc1-final",
    "Nancy": "1.4.3",
    "Microsoft.Framework.ConfigurationModel": "1.0.0-beta4",
    "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta4",
    "Microsoft.Extensions.OptionsModel": "1.0.0-rc1-final"
},

DNX ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „:

1.0.0-rc1-update1 mono

๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@RTodorov TinyIoC ๋Œ€์‹  Microsoft.Extensions.DependencyInjection ๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ•˜๋Š” Nancy ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฏธ ๋งŽ์€ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  6 ๋Œ“๊ธ€

IOptions๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.Nancy์˜ ์ปจํ…Œ์ด๋„ˆ์— ์•„๋ฌด๋ฐ๋‚˜ ๋„ฃ์–ด๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋งˆ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. "services.Configure(Configuration.GetSection("AppSettings"));"์ด(๊ฐ€) ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ์ง€๋งŒ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์œ ํ˜•์„ Nancy์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž์‹ ๋งŒ์˜ ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํผ ๋งŒ๋“ค๊ธฐ, IOptions ์ „๋‹ฌNancy ์‚ฌ์šฉ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ctor์— ๋„ฃ์€ ๋‹ค์Œ ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํผ์—์„œ ConfigureApplicationContainer์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณต์œ ํ•˜๋ ค๋Š” ์œ ํ˜•์ด ๋” ์žˆ์œผ๋ฉด ์œ„์™€ ๋™์ผํ•˜๊ฒŒ ํ•˜๋˜ ์œ ํ˜•์„ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ์ƒˆ๋กœ ๊ตฌ์„ฑ๋œ TinyIocContainer๋ฅผ ์ „๋‹ฌํ•œ ๋‹ค์Œ ํŒŒ์ƒ๋œ ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํผ์—์„œ GetApplicationContainer์— ๋Œ€ํ•œ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋“ฑ๋ก์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Nancy.TinyIoc.TinyIoCContainer.Current.Register(typeof(IOptions<>), typeof(OptionsManager<>));

services.AddOptions(); ๊ฐ€ Microsoft.Extensions.DependencyInjection ์— ๋Œ€ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” BTW๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒŒ ๋‹ˆ๊ฐ€ํ•˜๋ ค๊ณ ํ–ˆ๋˜ ๊ฑฐ ๋งž์•„?

services.Configure()๋Š” ๋กœ๋“œ๋œ ๊ตฌ์„ฑ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋ˆ„๊ตฐ๊ฐ€ AppSettings๊ฐ€ ํ•„์š”ํ•  ๋•Œ MS DI์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

container.Register<IOptions<ElasticSearchConfig>, OptionsManager<ElasticSearchConfig>>();

์ด์ œ ์˜ค๋ฅ˜๋Š” ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๊ฐœ์ฒด๋Š” ๋น„์–ด ์žˆ๊ฒŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋””๋ฒ„๊น…ํ•  ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ์ฑ„์›Œ์ง„ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

`var appSettings = app.ApplicationServices.GetService>();``

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

var appSettings = Nancy.TinyIoc.TinyIoCContainer.Current.Resolve<IOptions<AppSettings>>();

๊ทธ๋ž˜๋„ IOptions๋ฅผ ์š”์ฒญํ•  ๋•Œ TinyIoc์ด Ms Framework DI๋ฅผ ๋Œ€์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.. ๋‚˜๋Š” ๋˜ํ•œ ๋ชจ๋“  Microsoft.* dll์ด TinyIoc์˜ Ignore ๋ชฉ๋ก์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. Microsoft.Extensions.OptionsModel.IOptions ์š”์ฒญํ•  ๋•Œ "์‘๋‹ต"ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๊นŒ?

์›๋ž˜ ๋งํ–ˆ๋“ฏ์ด ํ•ด๋‹น ์œ ํ˜• ์ธ์Šคํ„ด์Šค ๋˜๋Š” ๊ตฌ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. GetService ํŒฉํ† ๋ฆฌ์—์„œ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์œ ํ˜• ์ž์ฒด๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ด, ์ด์ œ ๋‹น์‹ ์ด ๋งํ•œ ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค! ๋‚ด๊ฐ€ ๋ณด๋‚ธ IApplicationBuilder ์‚ฌ์šฉ์ž ์ •์˜ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ์—์™€์ด ๋“ฑ๋ก์—์„œ IOptions<AppSettings> ์—์„œ ๋ฐ˜ํ™˜ ๋œ ๊ฐ’์œผ๋กœ ApplicationServices.GetService() .

TinyIoc์ด ๋‚ด ์„œ๋น„์Šค์™€ Microsoft.Extensions.DependencyInjection ์‚ฌ์ด์˜ ๊ฒŒ์ดํŠธ์›จ์ด ์—ญํ• ์„ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ตœ์„ ์˜ ์†”๋ฃจ์…˜์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@RTodorov TinyIoC ๋Œ€์‹  Microsoft.Extensions.DependencyInjection ๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ•˜๋Š” Nancy ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฏธ ๋งŽ์€ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰