在檢查了關于 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)
};
uj5u.com熱心網友回復:
我想通了。
關鍵是您還需要在依賴項配置中添加要訪問的控制器。
就我而言,我只需要添加:
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);
取自這里:依賴注入不適用于 Owin 自托管 Web Api 2 和 Autofac
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/422235.html
標籤:
