【发布时间】:2018-05-16 16:42:30
【问题描述】:
“UserController”类型的创建控制器失败。确保 控制器有一个无参数的公共构造函数
使用 AutoFac,我注册了 UnitOfWork 存储库,如下所示,我还粘贴了控制器代码和堆栈跟踪。请协助。无法理解为什么控制器需要无参数的公共构造函数。
private static IContainer RegisterServices(ContainerBuilder builder)
{
//Register your Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<UserContext>().As<DbContext>().InstancePerRequest();
builder.RegisterType<DBFactory>().As<IDBFactory>().InstancePerRequest();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
builder.RegisterGeneric(typeof(GenericRepo<>)).As(typeof(IGenericRepo<>)).InstancePerRequest();
//Set the dependency resolver to be Autofac.
Container = builder.Build();
return Container;
}
private readonly IUnitOfWork _unitofwork;
public UserController(IUnitOfWork uow)
{
_unitofwork = uow;
}
[HttpGet]
public IEnumerable<UserDetail> UserData()
{
return _unitofwork.userDetail.GetAllUsers();
}
堆栈跟踪
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.<Execute>b__0()
at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Activators.Reflection.AutowiringParameter.<>c__DisplayClass2.<CanSupplyValue>b__0()
at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType)
at Autofac.Integration.WebApi.AutofacWebApiDependencyScope.GetService(Type serviceType)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
控制器:
public class UserController : ApiController
{
private readonly IUnitOfWork _unitofwork;
public UserController(IUnitOfWork uow)
{
_unitofwork = uow;
}
[HttpGet]
public IEnumerable<UserDetail> UserData()
{
return _unitofwork.userDetail.GetAllUsers();
}
}
【问题讨论】:
-
只是为了检查 - 您实际上已将 AutoFac 注册为
DependencyResolver为 per here? -
你也注册
UserContorller了吗? -
不,我没有。我需要在哪里注册?但是 UnitOfWork 已注册。
-
请分享Startup类
-
@MarcusHöglund 你的意思是 AutofacWebapiConfig 类吗?没有 Startup.cs
标签: c# asp.net-web-api dependency-injection autofac