确保控制器有一个无参数的公共构造函数错误
我已经按照这个教程已经很好,直到我修改我的DbContext
有一个额外的构造函数。 我现在有问题的决议,不知道该怎么做来解决这个问题。 有没有一种简单的方法来强制它抢无参数的构造函数或我正在接近这个错误?
带有两个构造函数的DbContext
:
public class DashboardDbContext : DbContext { public DashboardDbContext() : base("DefaultConnection") { } public DashboardDbContext(DbConnection dbConnection, bool owns) : base(dbConnection, owns) { } }
SiteController
构造函数:
private readonly IDashboardRepository _repo; public SiteController(IDashboardRepository repo) { _repo = repo; }
库:
DashboardDbContext _context; public DashboardRepository(DashboardDbContext context) { _context = context; }
UnityResolver
代码:
public class UnityResolver : IDependencyResolver { private readonly IUnityContainer _container; public UnityResolver(IUnityContainer container) { _container = container; } public object GetService(Type serviceType) { try { return _container.Resolve(serviceType); } catch (ResolutionFailedException) { return null; } } public IEnumerable<object> GetServices(Type serviceType) { try { return _container.ResolveAll(serviceType); } catch (ResolutionFailedException) { return new List<object>(); } } public IDependencyScope BeginScope() { var child = _container.CreateChildContainer(); return new UnityResolver(child); } public void Dispose() { _container.Dispose(); } }
WebApiConfig:
var container = new UnityContainer(); container.RegisterType<IDashboardRepository, DashboardRepository>(new HierarchicalLifetimeManager()); config.DependencyResolver = new UnityResolver(container);
来自WebApi Call的错误:
System.InvalidOperationException:尝试创buildtypes为“SiteController”的控制器时发生错误。 确保控制器有一个无参数的公共构造函数。
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()
InnerException:System.ArgumentException:types“Dashboard.Web.Controllers.SiteController”没有默认的构造函数。
at System.Linq.Expressions.Expression.New(Type type) at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 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)
该教程是伟大的,一直工作得很好,直到我添加第二个构造函数。
发生什么事情就是你被这个问题困住了。 基本上,发生了什么事是你没有明确注册你的控制器在你的容器。 Unity会尝试为您parsing未注册的具体types,但由于它无法parsing(由您的configuration中的错误引起),它将返回null。 它被强制返回null,因为Web API迫使它由于IDependencyResolver
合同而这样做。 由于Unity返回null,Web API将尝试创build控制器本身,但由于它没有默认的构造函数,它会抛出“确保控制器有一个无参数的公共构造函数”exception。 这个例外信息是误导性的,并不能解释真正的原因。
如果你明确地注册了你的控制器,你将会看到更清晰的exception信息,这就是为什么你应该总是注册所有的根types。
但是,当然,configuration错误来自您将第二个构造函数添加到您的DbContext
。 Unity总是试图挑选最具参数的构造函数,但是不知道如何解决这个特定的构造函数。
所以真正的原因是你正在尝试使用Unity的自动布线function来创buildDbContext
。 DbContext
是一种不应该自动连线的特殊types。 这是一个框架types, 因此您应该使用工厂委托来备份它 :
container.Register<DashboardDbContext>( new InjectionFactory(c => new DashboardDbContext()));
在我的情况下,这是因为我的注入依赖构造函数内的exception(在你的例子 – 在DashboardRepository的构造函数内)。 MVC基础架构中的某处出现了exception。 我在相关的地方添加日志后发现这个。
有时候,因为你在ContainerBootstraper.cs中parsing你的接口,所以很难捕获错误。 在我的情况下,解决了我已经注入到API控制器的接口的实现有一个错误。 我无法find错误,因为我已经解决了我的bootstraperContainer中的接口,如下所示: container.RegisterType<IInterfaceApi, MyInterfaceImplementaionHelper>(new ContainerControlledLifetimeManager());
然后我在我的引导容器中添加了以下行: container.RegisterType<MyController>();
所以当我编译这个项目时,编译器抱怨并停在上面的行,显示错误。
我有同样的问题,我通过在UnityConfig.cs文件中进行更改来解决问题为了解决UnityConfig.cs文件中的依赖关系问题,您必须添加:
public static void RegisterComponents() { var container = new UnityContainer(); container.RegisterType<ITestService, TestService>(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); }