public
class
NameSpaceVersionRoutingConvention:IApplicationModelConvention
{
private
readonly
string
apiPrefix;
private
const
string
urlTemplate =
"{0}/{1}/{2}"
;
public
NameSpaceVersionRoutingConvention(
string
apiPrefix =
"api"
)
{
this
.apiPrefix = apiPrefix;
}
public
void
Apply(ApplicationModel application)
{
foreach
(
var
controller
in
application.Controllers)
{
var
hasRouteAttribute = controller.Selectors
.Any(x => x.AttributeRouteModel !=
null
);
if
(!hasRouteAttribute)
{
continue
;
}
var
nameSpaces = controller.ControllerType.Namespace.Split(
'.'
);
var
version = nameSpaces.FirstOrDefault(x => Regex.IsMatch(x,
@"^v(\d+)$"
));
if
(
string
.IsNullOrEmpty(version))
{
continue
;
}
string
template =
string
.Format(urlTemplate, apiPrefix, version,
controller.ControllerName);
controller.Selectors[0].AttributeRouteModel =
new
AttributeRouteModel()
{
Template = template
};
}
}
}