【问题标题】:Dependency injection stops working when Web Api is published发布 Web Api 时,依赖注入停止工作
【发布时间】:2016-10-18 18:14:08
【问题描述】:

我有一个带有带有参数的构造函数的控制器的 Web Api,如下所示:

public class UserController : ApiController
    {
        private UserService userService;
        public UserController(UserService userService)
        {
            this.userService = userService;
        }
}

我正在使用依赖注入。我关注了this tutorial,现在是这样的:

public static class UnityConfig
    {
        public static void RegisterComponents()
        {
            var container = new UnityContainer();

            // register all your components with the container here
            // it is NOT necessary to register your controllers

            // e.g. container.RegisterType<ITestService, TestService>();

            GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
        }
    }
public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            var container = new UnityContainer();
            container.RegisterType<UserService>().RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());
            container.RegisterType<ProviderService>().RegisterType<UserService>().RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());
            container.RegisterType<TransactionService>().RegisterType<UserService>().RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());
            config.DependencyResolver = new UnityResolver(container);
...
}

当我从 Visual Studio 运行它并通过 Postman 对其进行测试时,它工作得很好。但是当我发布 Api 并尝试从发布的版本运行它时,我收到了这个错误:

ExceptionMessage:尝试创建“UserController”类型的控制器时发生错误。确保控制器有一个无参数的公共构造函数。

en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
en System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
en System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()

System.ArgumentException:“PaymentManagement.Web.Api.Controllers.UserController”类型没有预先确定的构造函数

en System.Linq.Expressions.Expression.New(Type type)
en System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)
en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

这是我发布它的方式:

在添加统一容器之前从 Visual Studio 运行它时,我曾经遇到过同样的错误。但我不知道我现在错过了什么。

【问题讨论】:

  • 关于 DI:UserController 依赖于 UserService。它不应该依赖于细节。创建 UserController 所依赖的 UserService 的接口 IUserService。然后你打破 UserControllers 对 UserService 的依赖。
  • 你应该明确注册你的控制器。当你这样做时,你会看到一个更具表现力的异常,它会告诉你你的配置出了什么问题。

标签: c# asp.net dependency-injection visual-studio-2015 unity-container


【解决方案1】:

最后的问题是 EntityFramework.SqlServer.dll 没有被添加到发布文件夹中。 我找到了解决方案herehere

通过将该 dll 复制到我发布的 API 的 bin 文件夹,问题得到解决。

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 2017-10-22
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多