Я создаю веб-API с использованием веб-API MVC4 с контейнером IoC (в данном случае Simple Injector, но я не думаю, что эта проблема связана с этим контейнером), который должен предоставлять различные операции CRUD и запросов. Причина использования IOC в моем случае заключается в том, что мы являемся магазином разработчиков, и мне нужно позволить клиентам создавать свои собственные контроллеры веб-API, чтобы предоставлять данные, которые им нужны, чтобы выявлять потребность в нашей системе. Следовательно, я надеялся спроектировать свое решение таким образом, чтобы я мог протестировать свой собственный продукт, сделав все контроллеры, как наши, так и наших клиентов, внешними и загружаемыми через IOC.
На веб-сайте нет ссылки на библиотеку, но библиотека содержит контроллеры, которые я хочу использовать на веб-сайте. Типы регистрируются в контейнере, а для DependencyResolver устанавливается настраиваемый сопоставитель зависимостей. У меня есть код, который находит плагин dll и загружает тип контроллера, но когда я пытаюсь перейти к маршруту, который он будет представлять, он говорит, что не может его найти.
то есть, если я попытаюсь перейти к /api/Test1Api, я должен увидеть текст hello world
Моя проблема здесь в том, что, хотя я загрузил свой тип контроллера, я не могу преобразовать его в маршрут, который есть на веб-сайте.
я получаю ошибку
Не найден ресурс HTTP, соответствующий URI запроса.
Не найдено ни одного типа, соответствующего контроллеру с именем «Test1Api».
Вот как я регистрирую контейнер
public static class SimpleInjectorInitializer
{
/// <summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
public static void Initialize()
{
//// Did you know the container can diagnose your configuration? Go to: http://bit.ly/YE8OJj.
// Create the IOC container.
var container = new Container();
InitializeContainer(container);
container.RegisterMvcAttributeFilterProvider();
// Verify the container configuration
container.Verify();
// Register the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
private static void InitializeContainer(Container container)
{
var appPath = AppDomain.CurrentDomain.BaseDirectory;
string[] files = Directory.GetFiles(appPath + "\\bin\\Plugins", "*.dll",
SearchOption.AllDirectories);
var assemblies = files.Select(Assembly.LoadFile);
// register Web API controllers
var apiControllerTypes =
from assembly in assemblies
where !assembly.IsDynamic
from type in assembly.GetExportedTypes()
where typeof(IHttpController).IsAssignableFrom(type)
where !type.IsAbstract
where !type.IsGenericTypeDefinition
where type.Name.EndsWith("Controller", StringComparison.Ordinal)
select type;
// register MVC controllers
var mvcControllerTypes =
from assembly in assemblies
where !assembly.IsDynamic
from type in assembly.GetExportedTypes()
where typeof(IController).IsAssignableFrom(type)
where !type.IsAbstract
where !type.IsGenericTypeDefinition
where type.Name.EndsWith("Controller", StringComparison.Ordinal)
select type;
foreach (var controllerType in apiControllerTypes)
{
container.Register(controllerType);
}
foreach (var controllerType in mvcControllerTypes)
{
container.Register(controllerType);
}
}
}
Любая помощь приветствуется.
IAssembliesResolver
/DefaultAssembliesResolver
). Поскольку вы загружаете эти сборки плагинов, я ожидал, что Web API подберет их автоматически. - person Steven   schedule 01.06.2013