.NET MVC 4 рдореЗрдВ рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг

рд╢реБрдн рджрд┐рдиред

ASP.NET рд╡реЗрдм рдПрдкреАрдЖрдИ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде , рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕рдордп рдХреЗ рд╕рд╛рде, рдЖрдкрдХрд╛ рдПрдкреАрдЖрдИ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдкреВрд░рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЦрд░реЛрдВрдЪ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреБрд░рд╛рдиреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдлрд┐рд▓рд╣рд╛рд▓, Microsoft рдиреЗ рд╡рд░реНрдЬрдирд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЬреЛ рднреА рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрд╛ рд╣реИ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖ рдЧрдпрд╛ рд╣реИред рдореИрдВ рд╕рдВрд╕реНрдХрд░рдгрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ рдФрд░ рдпрджрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреНрд▓реЙрдХ рдмрдЪрд╛рдПрдВрдЧреЗред рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рдорд╛рдирджрдВрдб рд╕рдорд╛рди рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рдереА, рд▓реЗрдХрд┐рди рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рд╣реЛ рдЧрдПред

рдЗрд╕реА рд╕рдордп, ASP.NET MVC рд╡реЗрдм рдПрдкреАрдЖрдИ рдореЗрдВ IHttpControllerSelector рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрдВрддреНрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХреЛрдб рдХреЛ рд╕рд╛рдл рдФрд░ рд╕рдордЭ рдореЗрдВ рдЫреЛрдбрд╝рдХрд░, рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЖрдпрд╛ред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рдП (рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВрдЧреЗ)ред

httpRoutes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/v{version}/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рд╕рднреА рдПрдкреАрдЖрдИ рддрд░реАрдХреЗ рдПрдкреАрдЖрдИ / рд╡реА {рд╕рдВрд╕реНрдХрд░рдг} / {рдирд┐рдпрдВрддреНрд░рдХ} / {рдЖрдИрдбреА} рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ {рд╕рдВрд╕реНрдХрд░рдг} рдПрдкреАрдЖрдИ рдХреА рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рди рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рдХреБрдЫ рднреАред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рд╕рд╣реА рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХрд╛ рдЪрдпрди рдФрд░ рдирд┐рд░реНрдорд╛рдгред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд▓рдЧрддреА рд╣реИред рдХрдВрдЯреНрд░реЛрд▓рд░ рдлреИрдХреНрдЯреНрд░реА рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрд╕реЗ рдХреМрди рд╕рд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рдирд╛ рд╣реИред рдпрд╣ рдареАрдХ рд╡рд╣реА рд╣реИ рдЬреЛ IHttpControllerSelector рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рд╣реИред

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХ DefaultHttpControllerSelector рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд░реЛрдВрдЪ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо DefaultHttpControllerSelector рдХреЛ рддреНрдпрд╛рдЧ рджреЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреА рдореБрдЦреНрдп SelectController рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдкрд╕рдВрдж рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдПрдХ рд╣реИрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рд░рдЦрд╛рдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

 public class HttpControllerSelector : DefaultHttpControllerSelector { private readonly HttpConfiguration configuration; public HttpControllerSelector(HttpConfiguration configuration) : base(configuration) { this.configuration = configuration; } public override HttpControllerDescriptor SelectController(HttpRequestMessage request) { } } 

рдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЗрд▓реЗрдХреНрдЯрд░ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрддрдорд╛рди HttpConfiguration рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ IoC рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдХреНрд╕рд░ рдореИрдВ рдХреИрд╕рд▓ рд╡рд┐рдВрдбрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 container.Register( Component.For<IHttpControllerSelector>().ImplementedBy<HttpControllerSelector>().DependsOn( Dependency.OnValue<HttpConfiguration>(GlobalConfiguration.Configuration))); 

рдЕрдм рд╣рдо рд╕реАрдзреЗ SelecController рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдЪрдпрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред
рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рд╕реЗ HttpControllerDescriptor рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдирд╛рдо рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

 HttpControllerDescriptor(HttpConfiguration, String, Type) 

рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо DefaultHttpControllerSelector рд╡рд░реНрдЧ рдХреА рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 var controllerName = GetControllerName(request); 

рдпрджрд┐ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реАрд▓реНрдб рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

 public class HttpControllerSelector : DefaultHttpControllerSelector { private readonly HttpConfiguration configuration; private readonly Lazy<ConcurrentDictionary<string, Type>> controllerTypes; public HttpControllerSelector(HttpConfiguration configuration) : base(configuration) { this.configuration = configuration; controllerTypes = new Lazy<ConcurrentDictionary<string, Type>>(GetControllerTypes); } public override HttpControllerDescriptor SelectController(HttpRequestMessage request) { var controllerName = GetControllerName(request); } private static ConcurrentDictionary<string, Type> GetControllerTypes() { var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var types = assemblies .SelectMany(a => a.GetTypes().Where(t => !t.IsAbstract && t.Name.EndsWith(ControllerSuffix, StringComparison.OrdinalIgnoreCase) && typeof (IHttpController).IsAssignableFrom(t))) .ToDictionary(t => t.FullName, t => t); return new ConcurrentDictionary<string, Type>(types); } } 

рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рднреА рдЪрд╛рд╣рд┐рдП

 object version; request.GetRouteData().Values.TryGetValue("version", out version); 

рд╕рдВрд╕реНрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ

 var type = GetControllerType((string)version, controllerName); 

рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ: рдирд┐рдпрдВрддреНрд░рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ, рд╣рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЗ рд╕рдВрдЧрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдкрдбрд╝реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛

 private Type GetControllerType(string version, string controllerName) { var query = controllerTypes.Value.AsEnumerable(); return query.ByVersion(version) .ByControllerName(controllerName) .Select(x => x.Value) .Single(); } 

рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдХрд╕реНрдЯрдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

 public static IEnumerable<KeyValuePair<string, Type>> ByVersion(this IEnumerable<KeyValuePair<string, Type>> query, string version) { var versionNamespace = string.Format(CultureInfo.InvariantCulture, ".V{0}.", version); return query.Where(x => x.Key.IndexOf(versionNamespace, StringComparison.OrdinalIgnoreCase) != -1); } public static IEnumerable<KeyValuePair<string, Type>> ByControllerName(this IEnumerable<KeyValuePair<string, Type>> query, string controllerName) { var controllerNameToFind = string.Format(CultureInfo.InvariantCulture, ".{0}{1}", controllerName, DefaultHttpControllerSelector.ControllerSuffix); return query.Where(x => x.Key.EndsWith(controllerNameToFind, StringComparison.OrdinalIgnoreCase)); } 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдХрдХреНрд╖рд╛:

 public class HttpControllerSelector : DefaultHttpControllerSelector { private readonly HttpConfiguration configuration; private readonly Lazy<ConcurrentDictionary<string, Type>> controllerTypes; public HttpControllerSelector(HttpConfiguration configuration) : base(configuration) { this.configuration = configuration; controllerTypes = new Lazy<ConcurrentDictionary<string, Type>>(GetControllerTypes); } public override HttpControllerDescriptor SelectController(HttpRequestMessage request) { object version; request.GetRouteData().Values.TryGetValue("version", out version); var controllerName = GetControllerName(request); var type = GetControllerType((string)version, controllerName); return new HttpControllerDescriptor(configuration, controllerName, type); } private static ConcurrentDictionary<string, Type> GetControllerTypes() { var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var types = assemblies .SelectMany(a => a.GetTypes().Where(t => !t.IsAbstract && t.Name.EndsWith(ControllerSuffix, StringComparison.OrdinalIgnoreCase) && typeof (IHttpController).IsAssignableFrom(t))) .ToDictionary(t => t.FullName, t => t); return new ConcurrentDictionary<string, Type>(types); } private Type GetControllerType(string version, string controllerName) { var query = controllerTypes.Value.AsEnumerable(); return query.ByVersion(version) .ByControllerName(controllerName) .Select(x => x.Value) .Single(); } } public static class ControllerTypeSpecifications { public static IEnumerable<KeyValuePair<string, Type>> ByVersion(this IEnumerable<KeyValuePair<string, Type>> query, string version) { var versionNamespace = string.Format(CultureInfo.InvariantCulture, ".V{0}.", version); return query.Where(x => x.Key.IndexOf(versionNamespace, StringComparison.OrdinalIgnoreCase) != -1); } public static IEnumerable<KeyValuePair<string, Type>> ByControllerName(this IEnumerable<KeyValuePair<string, Type>> query, string controllerName) { var controllerNameToFind = string.Format(CultureInfo.InvariantCulture, ".{0}{1}", controllerName, DefaultHttpControllerSelector.ControllerSuffix); return query.Where(x => x.Key.EndsWith(controllerNameToFind, StringComparison.OrdinalIgnoreCase)); } } 

рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреЙрд░реНрдо рдХрд╛ рдирд┐рдпрдВрддреНрд░рдХ рд░рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг рддрдВрддреНрд░ рд╣реИ

 Controllers.Api.V1.UserController Controllers.Api.V2.UserController 


рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреАрдЖрдИ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдирд╡реАрдирддрдо рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In165149/


All Articles