๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋ฌธ์ ๋ฅผ ์ด๊ณ ๊ฐ๋ฅํ ํ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋๋ ๋ฌธ์ ํด๊ฒฐ์ ๋์์ด ๋ ์ ์๋ค๊ณ ์๊ฐ๋๋ ๊ฒฝ์ฐ ํ ๋ฆฌํ์คํธ ๋ฅผ ์ ์ถํ์ญ์์ค. pull-request๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๋ด๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ธฐ์ฌ ์ง์นจ์ ์ดํด๋ณด์ญ์์ค. ์คํ์ผ ๊ฐ์ด๋๋ผ์ธ ์ ๋์น์ง ์๋๋ก ํด์ฃผ์ธ์. ์ ๋ ๋์น์ง ์๊ฒ ์ต๋๋ค. :D
์ฐธ๊ณ : Nancy 2.0-clinteastwood๋ ์ํํ์ด๋ฏ๋ก
-pre
ํ ๊ธ(์:install-package Nancy -pre
)์ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
๋ณด๊ณ ๋ ํน์ ๋ฒ๊ทธ ๋๋ ํ ์์ฒญ๊ณผ ์ง์ ๊ด๋ จ์ด ์๋ ๋๊ธ์ ๊ฒ์ํ ๋ ์ด ๋ฌธ์ ๋ฅผ ์ฌ์ฉํ์ธ์.
๋ค์์ 2.0.0-clinteastwood
๋ฆด๋ฆฌ์ค ์ดํ์ ์ํํด์ผ ํ๊ณ $#$3 2.0.0-dangermouse
#$ ๋ฆด๋ฆฌ์ค ์ ์ ์๋ฃ๋์ด์ผ ํ๋ ์๋ณ๋ ์์
๋ชฉ๋ก์
๋๋ค. TODO ๋ชฉ๋ก์ ํธ์งํ๊ณ ํญ๋ชฉ์ด ๋ฐ๊ฒฌ๋๋ฉด ์ถ๊ฐํ๊ณ , ํญ๋ชฉ์ ๋ซ๊ธฐ ์ํด ์ ์ก๋๋ ๋์ด์ค๊ธฐ ์์ฒญ์ ๋ํ ๋งํฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
AsyncUsageAnalyzers
๊ฐ ๋ชจ๋ project.json
๋ฐ packages.config
์์ ๋น๋ ์ข
์์ฑ์ผ๋ก ์ค์ ๋์๋์ง ํ์ธํ์ญ์์ค. ์ฌ๊ธฐ ์ ๋ฏธ๋ฌ๋งํ ์ฌ๋ฐ๋ฅธ ์ - (pull request #2700 @jchannon*.nuspec
ํ์ผ ์ ๊ฑฐ(Nancy ํฌํจ) (pull-request #2658 @jchannon)web.config.transform
๋ฅผ ํจํค์ง์ ํฌํจํ๋๋ก $ Nancy.Hosting.Aspnet\project.json
์
๋ฐ์ดํธ(pull-request #2661 @thecodejunkie)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 ์ฐธ์กฐAsyncUsageAnalyzers
๋ฅผ ์ข
์์ฑ์ผ๋ก ์ค์นํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์์ ํด์ผ ํ๋ฉฐ ๋ชจ๋ ํ๋ก์ ํธ์์ ๋น๋ ์ข
์์ฑ์ผ๋ก ํ์๋๋ฏ๋ก 2.0.0-dangermouse
์ ํฌํจ๋์ง ์์ต๋๋ค.Nancy.Hosting.Aspnet
ํจํค์ง๋ *.config
๋ณํ์ ์ ์ฉ ํ์ง ์์ต๋๋ค . ํธ์คํ
์ ์ฐ๊ฒฐํ๋ ค๋ฉด ์ง์ ์ ์ฉํด์ผ ํฉ๋๋ค.Nancy.ViewEngines.Razor
ํจํค์ง๋ ๋ณด๊ธฐ ์์ง ๊ตฌ์ฑ ์ต์
์ ์ฐ๊ฒฐํ๊ธฐ ์ํด *.config
๋ณํ์ ์ ์ฉํ์ง ์์ต๋๋ค . ์ง์ ์ ์ฉํด์ผ ํฉ๋๋ค.Nancy.ViewEngines.Razor
์ ๋ํ ๋น๋ ๊ณต๊ธ์๊ฐ NuGet ํจํค์ง์์ ๋๋ฝ๋์ด Nancy Razor ๋ณด๊ธฐ์์ ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.์ด๊ฒ์ ์ปดํ์ผ๋์ง๋ง ๋ฐํ์ 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์ ์ฐ๋ฌ๋ณผ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ธฐ๋ณธ ๋ชจ๋์ IoC ์ปจํ ์ด๋๊ฐ ๋ง์กฑํ ์ ์๋ ์์ฑ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
string
์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค.BaseModule
์์ฒด์ ์ผ๋ก ํธ์ถ๋์ง ์์ผ๋ฉดabstract
...