【发布时间】:2017-03-30 16:06:56
【问题描述】:
我对 WebApi 中的 DI 有疑问。我已经用instruction 相应地添加了autofac。但是解析控制器有问题。
我收到一个错误:
{
"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred when trying to create a controller of type 'ValuesController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Type 'WebApiOwinAutoFac.Controllers.ValuesController' does not have a default constructor",
"ExceptionType": "System.ArgumentException",
"StackTrace": " at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
}
}
Startup.cs
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var builder = new ContainerBuilder();
// STANDARD WEB API SETUP:
// Get your HttpConfiguration. In OWIN, you'll create one
// rather than using GlobalConfiguration.
var config = new HttpConfiguration();
// Register your Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// builder.RegisterType<ApplicationDbContext>().AsSelf().InstancePerLifetimeScope();
builder.RegisterType<TestRepository>().As<ITestRepository>();
// Run other optional steps, like registering filters,
// per-controller-type services, etc., then set the dependency resolver
// to be Autofac.
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
// OWIN WEB API SETUP:
// Register the Autofac middleware FIRST, then the Autofac Web API middleware,
// and finally the standard Web API middleware.
app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(config);
app.UseWebApi(config);
ConfigureAuth(app);
}
}
ValuesController.cs
[RoutePrefix("api/Values")]
public class ValuesController : ApiController
{
private ITestRepository _context { get; set; }
public ValuesController(ITestRepository context)
{
_context = context;
}
// GET api/values/5
[HttpGet]
public string GetTest()
{
var testList = _context.GetAll();
return String.Join(",", testList.Select(s => s.Name));
}
}
ITestRepository.cs
public interface ITestRepository
{
IEnumerable<TestModel> GetAll();
}
TestRepository.cs
public class TestRepository : ITestRepository
{
private ApplicationDbContext _context = new ApplicationDbContext();
public IEnumerable<TestModel> GetAll()
{
return _context.Tests;
}
}
我尝试使其工作的示例项目可在GitHub 上找到: 感谢您的帮助。
【问题讨论】:
-
您从问题中省略了最重要的
Global.asax代码...这实际上指向了答案:您尚未完全转换为 OWIN。
标签: c# dependency-injection asp.net-web-api2 owin autofac