рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ,
"рдлрд░реНрд╕реНрдЯ рдиреИрдВрд╕реАрдПрдлрдПрдХреНрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛", рд╣рдордиреЗ рдиреИрдиреНрд╕реАрдПрдлрдПрдХреНрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реАрдЦрдиреЗ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рдЙрдард╛рдпрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдиреИрдиреНрд╕реА рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯрд┐рдиреАрдЖрдИрдУрд╕реА рдФрд░ рдиреИрдиреНрд╕реА рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХреЛ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗред
рдиреИрдиреНрд╕реА рд╡рд╛рд▓реЗ рдмреЙрдХреНрд╕ рдореЗрдВ рд╕реЗ рдЖрдкрдХрд╛ DI рдЖрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ TinyIoC рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ DI рдЖрдкрдХреЛ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд DI рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- Ninject
- Autofac
- StructureMap
- рд╡рд┐рдВрдбрд╕рд░
- MEF
- рд╢реАрдШреНрд░ рдореЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдиреИрдиреНрд╕реА рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд░
- рд╕реНрдкреАрдбреА рдореЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдиреИрдиреНрд╕реА рдореЛрдиреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд░
рдЙрдкрд░реЛрдХреНрдд рдбреАрдЖрдИрдПрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ Nuget рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рд╕рд░реНрдЪ рдмрд╛рд░ рдореЗрдВ nancy.bootstrappers рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред рдЪрд▓реЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ IUserStorage.cs рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдирдХрд▓реА рднрдВрдбрд╛рд░рдг рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
using System.Collections.Generic; namespace NancyFxApplication { public interface IUserStorage { IList<dynamic> GetAllUsers(); } }
рдЕрдЧрд▓рд╛, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рдирдХрд▓реА рднрдВрдбрд╛рд░рдг Storage.cs рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред
using System.Collections.Generic; namespace NancyFxApplication { public class Storage : IUserStorage { public IList<dynamic> GetAllUsers() { return new List<dynamic> { new {Name = "Homer", Age = 30}, new {Name = "Bart", Age = 12}, new {Name = "Marge", Age = 30}, new {Name = "Lisa", Age = 10} }; } } }
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдиреИрдиреНрд╕реА рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдВред
using Nancy; namespace NancyFxApplication { public class UsersModule : NancyModule { public UsersModule(IUserStorage storage) : base("/users") { Get["/GetAll"] = param => (Response.AsJson(storage.GetAllUsers())); } } }
рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, Nancy.Bootstrapper рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдпрд╛рд╕ рдХреЗ рдмрд┐рдирд╛ рдЖрд╡реЗрджрди рдореЗрдВ рдкрд╛рдпрд╛ IUserStorage рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрджрд┐ рдЖрд╡реЗрджрди рдореЗрдВ IUserStorage рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рддреЛ рдпрд╣ рд╣рдореЗрдВ рдХреБрдЫ рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреМрди рд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреИрдиреНрд╕реА рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдиреИрдиреНрд╕реА рдЖрд╡реЗрджрди рд╕реЗ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдорд┐рдХ рд╡рд░реНрдЧ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЕрдиреБрд░реЛрдзрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ)ред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рддреЛ TinyIoC рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдПрдЧрд╛ред
рдЖрдЗрдП рдирд┐рдореНрди рд╡рд░реНрдЧ рдХреЛ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред SouthParkUsers.cs
using System.Collections.Generic; namespace NancyFxApplication { public class SouthParkUsers : IUserStorage { public IList<dynamic> GetAllUsers() { return new List<dynamic> { new {Name = "Eric", SecondName = "Cartman", Age = 9}, new {Name = "Kenny", SecondName = "McCormick", Age = 9}, new {Name = "Kyle", SecondName = "Broflovski", Age = 9}, new {Name = "Stan", SecondName = "Marsh", Age = 9}, new {Name = "Butters", SecondName = "Stotch", Age = 9} }; } } }
рдЕрдм рд╡рд░реНрдЧ MyBootstrapper.cs рдЬреЛрдбрд╝реЗрдВред
using Nancy; namespace NancyFxApplication { public class MyBootstrapper : DefaultNancyBootstrapper { protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines) { base.ApplicationStartup(container, pipelines); container.Register<IUserStorage, SouthParkUsers>(); } } }
рдФрд░ рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдБред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ IUserStorage рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди NancyFX рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреИрдиреНрд╕реАрдПрдлрдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рдЖрдк
рдЯрд┐рдиреАрдЖрдИрдУрд╕реА рд╡рд┐рдХреА рдкрд░ рдФрд░ рд╕рд╛рде рд╣реА
рдиреИрдиреНрд╕реА рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд░ рд╡рд┐рдХреА рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдиреИрдиреНрд╕реА рдкрд░ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕рдореЗрдВ, рд╣рдо рдиреИрдиреНрд╕реА рдореЙрдбреНрдпреВрд▓ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд▓реЗрдЦ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред