我正在使用 MVC4 Web API 和 IoC 容器(在这种情况下为简单注入器,但我认为这个问题与该容器无关)构建一个 Web API,它应该公开各种 CRUD 和查询操作。在我的案例中使用 IOC 的原因是我们是一家开发商店,我需要能够让客户构建他们自己的 Web API 控制器来公开他们需要从我们的系统中公开需求的数据。因此,我希望设计我的解决方案,使我能够通过 IOC 将所有控制器(包括我们的和我们的客户的)都放在外部并可以加载,从而使我能够对自己的产品进行测试。
该网站没有对库的任何引用,但该库包含我想在网站中使用的控制器。这些类型在容器中注册,并且 DependencyResolver 设置为自定义依赖解析器。我有找到 dll 插件并加载控制器类型的代码,但是当我尝试导航到它所代表的路线时,它说它找不到它。
即如果我尝试导航到 /api/Test1Api 我应该看到文本“hello world”
我的问题是,虽然我已经加载了控制器类型,但我无法将其转换为网站所说的路径。
我得到错误
未找到与请求 URI 匹配的 HTTP 资源
找不到与名为“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);
}
}
}
任何帮助表示赞赏。