asp.net - 如何为自托管的 MVC 4 API 控制器配置依赖注入
问题描述
在检查了关于 SO 的所有类似问题后,我的问题仍然存在,所以我要为此提出一个新问题。
我有一个单元测试,它引用了另一个项目,该项目包含一个 MVC 4 ApiController
,它有一个用于依赖注入的构造函数。
public class DataController : ApiController
{
public DataController(IRepository repository){}
}
在我的测试中,我正在使用Microsoft.Extensions.DependencyInjection
并具有以下设置:
// Note: this redundant type access is necessary to load controllers from a different assembly,
// see https://stackoverflow.com/a/11758025/1468097
var type = typeof(DataController);
var services = new ServiceCollection().AddSingleton<IRepository>(new ImMemoryRepository());
var httpConfiguration = new HttpConfiguration
{
DependencyResolver = new DependencyResolver(services.BuildServiceProvider()),
IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always
};
httpConfiguration.Routes.MapHttpRoute("Default", "{controller}/{action}");
httpConfiguration.DependencyResolver = new DependencyResolver(services.BuildServiceProvider());
var httpServer = new HttpServer(httpConfiguration);
var client = new HttpClient(httpServer);
var response = await client.GetAsync("http://whatever/data/getdata?id=000");
我有一个相当简单的依赖解析器实现作为测试类中的嵌套私有类:
private class DependencyResolver : IDependencyResolver
{
private readonly ServiceProvider _serviceProvider;
public DependencyResolver(ServiceProvider serviceProvider) => _serviceProvider = serviceProvider;
public void Dispose() => _serviceProvider.Dispose();
public object GetService(Type serviceType) => _serviceProvider.GetService(serviceType);
public IEnumerable<object> GetServices(Type serviceType) => _serviceProvider.GetServices(serviceType);
public IDependencyScope BeginScope() => new Scope(_serviceProvider.CreateScope());
private class Scope : IDependencyScope
{
private readonly IServiceScope _scope;
public Scope(IServiceScope scope) => _scope = scope;
public void Dispose() => _scope.Dispose();
public object GetService(Type serviceType) => _scope.ServiceProvider.GetService(serviceType);
public IEnumerable<object> GetServices(Type serviceType) => _scope.ServiceProvider.GetServices(serviceType);
}
}
我从测试中得到的响应是 500 服务器错误说
Type 'Mvc.DataController' does not have a default constructor
似乎我正在做所有其他人在 MVC 4 中为依赖注入所做的事情,即使对于这个症状非常相似的问题也是如此。
我在这里遗漏了一些明显的东西吗?
更新
我试过NinjectResolver
归结为同样的问题:
var kernel = new StandardKernel();
kernel.Bind<IRepository>().ToConstant(new InMemoryRepository());
var httpConfiguration = new HttpConfiguration
{
DependencyResolver = new NinjectResolver(kernel)
};
解决方案
我想通了。
关键是您还需要在依赖项配置中添加要访问的控制器。
就我而言,我只需要添加:
var services = new ServiceCollection();
// This is what was missing.
services.AddTransient<DataController>();
取自这里(尽管我根本没有使用 OWIN):如何将 Microsoft.Extensions.DependencyInjection 添加到 OWIN 自托管 WebApi
另一个使用 Autofac 的例子:
var builder = new ContainerBuilder();
// You need to register the assembly that contains your controller.
builder.RegisterApiControllers(typeof(DataController).Assembly);
推荐阅读
- reactjs - ReferenceError: afterAll 没有定义
- memory - CUDA cudaMemcpy 问题
- javascript - 如何在javascript中将反斜杠包装为带有单引号或双引号的数组项
- git - GitHub文件夹上有一个白色箭头,打不开
- algorithm - 如何用递归树求解 T(n) = T(n-1) + n^2
- python-3.x - tkinter 更改背景颜色菜单选项
- javascript - 如何将 tickPositions 显示为 highcharts 中每个柱的开始和结束?
- ruby - 为什么在 docker 中运行的 sinatra 需要 tty 选项来登录 main?
- javascript - d3 面积图不显示
- php - 致命错误:无法在第 39 行的 C:\xampp\htdocs\app\language_helper.php 中重新声明 mb_str_split()