<p>Nancy 2.0.0-clinteastwood ํ”ผ๋“œ๋ฐฑ</p>

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

๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒฝ์šฐ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ๋ฅผ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค. pull-request๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•ˆ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ์—ฌ ์ง€์นจ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ ์„ ๋†“์น˜์ง€ ์•Š๋„๋ก ํ•ด์ฃผ์„ธ์š”. ์ ˆ๋Œ€ ๋†“์น˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. :D

์ฐธ๊ณ : Nancy 2.0-clinteastwood๋Š” ์‹œํ—˜ํŒ์ด๋ฏ€๋กœ -pre ํ† ๊ธ€(์˜ˆ: install-package Nancy -pre )์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๊ณ ๋œ ํŠน์ • ๋ฒ„๊ทธ ๋˜๋Š” ํ’€ ์š”์ฒญ๊ณผ ์ง์ ‘ ๊ด€๋ จ์ด ์—†๋Š” ๋Œ“๊ธ€์„ ๊ฒŒ์‹œํ•  ๋•Œ ์ด ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ•  ๊ฒƒ

๋‹ค์Œ์€ 2.0.0-clinteastwood ๋ฆด๋ฆฌ์Šค ์ดํ›„์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ณ  $#$3 2.0.0-dangermouse #$ ๋ฆด๋ฆฌ์Šค ์ „์— ์™„๋ฃŒ๋˜์–ด์•ผ ํ•˜๋Š” ์‹๋ณ„๋œ ์ž‘์—… ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. TODO ๋ชฉ๋ก์„ ํŽธ์ง‘ํ•˜๊ณ  ํ•ญ๋ชฉ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ์ถ”๊ฐ€ํ•˜๊ณ , ํ•ญ๋ชฉ์„ ๋‹ซ๊ธฐ ์œ„ํ•ด ์ „์†ก๋˜๋Š” ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • [x] AsyncUsageAnalyzers ๊ฐ€ ๋ชจ๋“  project.json ๋ฐ packages.config ์—์„œ ๋นŒ๋“œ ์ข…์†์„ฑ์œผ๋กœ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ ์— ๋ฏธ๋Ÿฌ๋งํ•  ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ - (pull request #2700 @jchannon
  • [x] ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“  ์ด์ „ *.nuspec ํŒŒ์ผ ์ œ๊ฑฐ(Nancy ํฌํ•จ) (pull-request #2658 @jchannon)
  • [x] web.config.transform ๋ฅผ ํŒจํ‚ค์ง€์— ํฌํ•จํ•˜๋„๋ก $ Nancy.Hosting.Aspnet\project.json ์—…๋ฐ์ดํŠธ(pull-request #2661 @thecodejunkie)
  • [x] ํŒจํ‚ค์ง€์— app/web.config.transform Nancy.ViewEngines.Razor\project.json ์—…๋ฐ์ดํŠธ(pull-request #2661 @thecodejunkie)
  • [ ] ํŒจํ‚ค์ง€์— Nancy.ViewEngines.Razor.BuildProvider (๋นŒ๋“œ ๋Œ€์ƒ ํฌํ•จ)์„ ํฌํ•จํ•˜๋„๋ก Nancy.ViewEngines.Razor\project.json ์—…๋ฐ์ดํŠธ

๊ณ„ํš๋œ ๋ณ€๊ฒฝ

  • [ ] Request.Cookies ๋ฐ Request.Headers.Cookie ์ค‘ ํ•˜๋‚˜ ์ œ๊ฑฐ ํ† ๋ก ์€ #2628 ์ฐธ์กฐ
  • [ ] Before ๋ฐ After ํ›„ํฌ ๊ตฌ๋ฌธ ๋ฐ ๊ธฐ๋Šฅ ๊ฐœ์„  #2665
  • [ ] "Nancy.Routing.Route.Invoke #2623์˜ ์ž ์žฌ์ ์ธ ์„ฑ๋Šฅ ๋ฌธ์ œ" ์‚ดํŽด๋ณด๊ธฐ
  • [ ] ์ฝ˜ํ…์ธ  ํ˜‘์ƒ์„ ์œ„ํ•œ ๊ตฌ์„ฑ ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ํ™•์žฅ ํ™•์ธ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” #2671์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • [ ] netstandard๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ…Œ์ŠคํŠธ ์ธํ”„๋ผ ์—…๋ฐ์ดํŠธ, ๋ฌธ์ œ #2612 ๋ฐ pull-request #2628 ์ฐธ์กฐ
  • [ ] ๋‚˜๋จธ์ง€ ํ•˜์œ„ ์‹œ์Šคํ…œ์„ ๋น„๋™๊ธฐ๋กœ ๋ณ€ํ™˜, pull-request #2577 ์ฐธ์กฐ
  • [ ] StaticConfiguration ์˜ ๋งˆ์ง€๋ง‰ ๋‚จ์€ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ

  • ์ผ๋ถ€ ํŒจํ‚ค์ง€๋Š” AsyncUsageAnalyzers ๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ด์•ผ ํ•˜๋ฉฐ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ๋นŒ๋“œ ์ข…์†์„ฑ์œผ๋กœ ํ‘œ์‹œ๋˜๋ฏ€๋กœ 2.0.0-dangermouse ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Nancy.Hosting.Aspnet ํŒจํ‚ค์ง€๋Š” *.config ๋ณ€ํ™˜์„ ์ ์šฉ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ํ˜ธ์ŠคํŒ…์„ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ์ง์ ‘ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Nancy.ViewEngines.Razor ํŒจํ‚ค์ง€๋Š” ๋ณด๊ธฐ ์—”์ง„ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด *.config ๋ณ€ํ™˜์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์ง์ ‘ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Nancy.ViewEngines.Razor ์— ๋Œ€ํ•œ ๋นŒ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ NuGet ํŒจํ‚ค์ง€์—์„œ ๋ˆ„๋ฝ๋˜์–ด Nancy Razor ๋ณด๊ธฐ์—์„œ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
Improvement Epic

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

๊ธฐ๋ณธ ๋ชจ๋“ˆ์— IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. string ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. BaseModule ์ž์ฒด์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด abstract ...

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

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„ NullReferenceException ์„ ๋˜์ง‘๋‹ˆ๋‹ค.

pipelines.BeforeRequest.AddItemToStartOfPipeline((ctx, _) =>
{
    // do stuff
    // Func<NancyContext, Response>, Func<NancyContext, CancellationToken, Response>
    return null;
});

์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

pipelines.BeforeRequest.AddItemToStartOfPipeline((ctx, _) =>
{
    //do stuff
    // Func<NancyContext, CancellationToken, Task<Response>>
    return Task<Response>.FromResult((Response)null);
});

์–ด๋Š ์ชฝ์ด ๊ณผํ•˜์ง€๋„ ์•Š๊ณ  ํ–‰๋ณตํ•˜์ง€๋„ ์•Š์€์ง€ ์•Œ์•„๋‚ผ ๋•Œ๊นŒ์ง€ ๋ฒฝ์— ๋จธ๋ฆฌ๋ฅผ ๋ถ€๋”ชํžˆ๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

@danbarua ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” https://github.com/NancyFx/Nancy/issues/2665 ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํผ๋ฅผ ๋ณผ ์‹œ๊ฐ„์ด ์žˆ๋Š” ์ฆ‰์‹œ ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ์ •๋ฐ€ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๋ฅผ ์ƒˆ๋กœ์šด csproj ํ˜•์‹์œผ๋กœ ์˜ฎ๊ฒผ๊ณ  ์ง€๊ธˆ #2720์—์„œ ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ผํฌ ๋ฉด๋„! ๐Ÿ˜„

์ด ์ฝ”๋“œ๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ์ธ๊ฐ€์š”?

```C#

๊ณต๊ฐœ ํด๋ž˜์Šค BaseModule : NancyModule
{
๊ณต๊ฐœ BaseModule(๋ฌธ์ž์—ด URL) : ๊ธฐ๋ณธ(URL)
{
//์‚ฌ์šฉ์ž ์ •์˜ ๋กœ์ง
}
}

๊ณต๊ฐœ ํด๋ž˜์Šค A : BaseModule
{
๊ณต๊ฐœ A() : base("urlA")
{

}

}

๊ณต๊ฐœ ํด๋ž˜์Šค B : NancyModule
{
๊ณต๊ฐœ B()
{

}

}


System.InvalidOperationException์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
H๊ฒฐ๊ณผ=0x80131509
Message=๊ตฌ์„ฑํ•˜๋Š” ๋™์•ˆ ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ถฉ์กฑํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์— ๋ชจ๋“  ์ƒˆ ์ข…์†์„ฑ์„ ๋“ฑ๋กํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  innerexception์—์„œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”.
์ถœ์ฒ˜=
์Šคํƒ ์ถ”์ :
Nancy.Bootstrapper.NancyBootstrapperBase 1.SafeGetNancyEngineInstance() at Nancy.Bootstrapper.NancyBootstrapperBase 1.GetEngine()
Nancy.Owin.NancyMiddleware.UseNancy(NancyOptions ์˜ต์…˜)
Nancy.Owin.DelegateExtensions.UseNancy(Action 1 builder, NancyOptions options) at PiggyBank.Site.Startup.<>c.<Configure>b__2_0(Action 1 x) E:visual_studiopiggy-banksourcePiggyBank.SiteStartup.cs:line 31
Microsoft.AspNetCore.Builder.OwinExtensions.UseOwin(IApplicationBuilder ๋นŒ๋”, Action`1 ํŒŒ์ดํ”„๋ผ์ธ)
E:visual_studiopiggy-banksourcePiggyBank.SiteStartup.cs:line 31์˜ PiggyBank.Site.Startup.Configure(IApplicationBuilder ์•ฑ, IHostingEnvironment ํ™˜๊ฒฝ, ILoggerFactory loggerFactory)์—์„œ

๋‚ด๋ถ€ ์˜ˆ์™ธ 1:
TinyIoCResolutionException: ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ: Nancy.NancyEngine

๋‚ด๋ถ€ ์˜ˆ์™ธ 2:
TinyIoCResolutionException: ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ: Nancy.Routing.DefaultRequestDispatcher

๋‚ด๋ถ€ ์˜ˆ์™ธ 3:
TinyIoCResolutionException: ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ: Nancy.Routing.DefaultRouteResolver

๋‚ด๋ถ€ ์˜ˆ์™ธ 4:
TinyIoCResolutionException: ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ: Nancy.Routing.RouteCache

๋‚ด๋ถ€ ์˜ˆ์™ธ 5:
TinyIoCResolutionException: ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ: BaseModule

๋‚ด๋ถ€ ์˜ˆ์™ธ 6:
TinyIoCResolutionException: ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ: System.String

๋‚ด๋ถ€ ์˜ˆ์™ธ 7:
TinyIoCResolutionException: ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Œ: System.Char[]

๋‚ด๋ถ€ ์˜ˆ์™ธ 8:
ArgumentNullException: ๊ฐ’์€ null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

```

๊ธฐ๋ณธ ๋ชจ๋“ˆ์— IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. string ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. BaseModule ์ž์ฒด์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด abstract ...

๋‚ก์€:

Get["post/{id}"] = Get["old/post/{id}"] = p =>{};

์ƒˆ๋กœ์šด(2.0):

?

Get("๊ฒŒ์‹œ๋ฌผ/{id}", MyMethod);
Get("old/post/{id}", MyMethod);

Get("๊ฒŒ์‹œ๋ฌผ/{id}", MyMethod);
Get("old/post/{id}", MyMethod);

๊ทธ ์‚ฌ์šฉ๋ฒ•์€ ์•ฝ๊ฐ„์˜ ๊ฐ„์ ‘ ์ฐธ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ์ฐฝํ•œ ํ‘œํ˜„์„ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ์‹œ:

Get("post/{id}")
.Get("old/post/{id}")
.Post("whatever/{id}", p => { return HttpStatusCode.Ok });

๋Œ€์ฒด ํ‘œํ˜„

Get("post/{id}")
.Get("old/post/{id}")
.Post("whatever/{id}")
.Do(p => { return HttpStatusCode.Ok });

์ด๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๋ฉด PR์„ ์ฐ”๋Ÿฌ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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