Não é possível resolver um controlador que foi carregado a partir da dll externa
Eu estou construindo uma API da Web usando MVC4 Web API com um contêiner IoC (Injector simples, neste caso, mas eu não acho que esse problema está relacionado a esse contêiner) que deve expor uma variedade de CRUD e operações de consulta. A razão para usar o COI no meu caso é que somos uma loja de desenvolvedores e precisamos permitir que os clientes criem seus próprios controladores de API da Web para expor os dados de que precisam para expor as necessidades do nosso sistema. Conseqüentemente, eu esperava projetar minha solução de uma forma que permitisse alimentar meu próprio produto, tornando todos os controladores, tanto nossos quanto de nossos clientes, externos e carregáveis através do COI.
O site não tem qualquer referência à biblioteca, mas a biblioteca contém controladores que eu quero usar no site. Os tipos são registrados no contêiner e o DependencyResolver é definido como o resolvedor de dependência personalizado. Eu tenho o código de encontrar o plugin dll e carregar o tipo de controlador, mas quando eu tento navegar para a rota que representaria diz que não pode encontrá-lo.
ou seja, se eu tentar navegar para / api / Test1Api, eu devo ver o texto "hello world"
Meu problema aqui é que, embora eu tenha carregado meu tipo de controlador, não consigo traduzir isso em uma rota que o site diz estar lá.
Eu recebo o erro
Não foi encontrado nenhum recurso HTTP que corresponda ao URI do pedido
Nenhum tipo foi encontrado que corresponda ao controlador chamado 'Test1Api'.
Aqui está como eu registro o contêiner
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);
}
}
}
Qualquer ajuda é apreciada.