【问题标题】:Unity DI not working in DI - default controller constructor called insteadUnity DI 在 DI 中不起作用 - 改为调用默认控制器构造函数
【发布时间】:2016-07-25 04:11:23
【问题描述】:

我正在尝试让 Unity Container Dependency Injection 在自托管的 o​​win 应用程序上工作。我已将 Unity nuget 包添加到我的项目中,并按如下方式设置了我的 UnityConfig 类:

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>();

        container.RegisterType<IDBContext,UniversalCoatingsDbContext>();
        container.RegisterType<IUserRepository,UserRepository>();

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}

然后,我像这样设置我的控制器:

public class UserController : ApiController
{
    private IUserRepository userRepo;

    public UserController() {
        Console.WriteLine("User controller default constructor");
    }

    //dependency injected value
    public UserController(IUserRepository repo)
    {
        this.userRepo = repo;
        Console.WriteLine("DI enabled constructor");
    }

    [HttpPost]
    public JsonResult<MessageResponse> Register(UnhashedUser unhashed_user)
    {
        MessageResponse response = new MessageResponse();
        if(ModelState.IsValid)
        {
            response = userRepo.createUser(unhashed_user);
        }
        else
        {
            response.message = "Invalid Request sent.";
        }

        return Json(response);

    }

}

在我的 Startup 类的 Configuration() 方法结束时调用 UnityConfig.RegisterComponents() 方法(在设置所有中间件之后)。当我访问这个控制器的 URL 时,总是调用无参数构造函数,因此 IUserRepository 的实例永远不会被解析。

我是否缺少某种配置模式?任何信息都非常感谢。

【问题讨论】:

  • 尝试删除默认构造函数
  • 如果我得到一个“无默认构造函数”异常
  • 尝试将其设为私有
  • 您确定您设置的DependencyResolver 正确吗?看看这个:damienbod.com/2013/10/01/self-host-webapi-with-owin-and-unity
  • 将默认构造函数设为私有没有任何区别(它仍然会被调用。我知道是因为其中的 Console.WriteLine() 语句正在执行。

标签: c# asp.net-web-api dependency-injection unity-container


【解决方案1】:

我修改了我的 UnityConfig 类以将容器公开为静态变量。然后,

我将此添加到我的启动课程中:

        //set up dependency injection
        UnityConfig.RegisterComponents();
        config.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(UnityConfig.container);
        app.UseWebApi(config);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2017-07-28
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多