【问题标题】:WebApi with Unity issue with parameterless constructor带有无参数构造函数的 Unity WebApi 问题
【发布时间】:2017-04-06 00:14:51
【问题描述】:

我第一次尝试在 WebApi 项目中设置 Unity。我从 Nuget 添加了 Unity.WebApi,我的 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<ApplicationDbContext>(
            new InjectionFactory(c => new ApplicationDbContext()));

        //container.RegisterType<ApplicationSignInManager>();
        container.RegisterType<ApplicationUserManager>();

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

    }

但是,如果我尝试调用默认控制器之一,Account/Register,我会收到一条错误消息,提示确保我有一个无参数的构造函数。

我查看了各种文章,这些文章解释了 Unity 在 MVC 和 WebApi 中的工作方式,但据我所知,我的配置是否正确?我猜我在这里遗漏了一些简单的东西,因为我的安装非常适合 MVC 项目中的构造函数注入。

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api dependency-injection inversion-of-control unity-container


    【解决方案1】:

    Unity 在尝试解决您的依赖关系时将使用最贪婪的构造函数(具有最大参数数量的构造函数),因此在 AccountController 的情况下,它有两个构造函数,第一个是无参数的,第二个是有两个参数的,如下所示,而这正是 unity 将尝试使用的。

    public AccountController(ApplicationUserManager userManager,
                ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
            {
                UserManager = userManager;
                AccessTokenFormat = accessTokenFormat;
            }
    

    要覆盖它,用InjectionConstructorAttribute装饰所需的构造函数。

    希望对您有所帮助。

    【讨论】:

    • 我实际上通过直接在控制器上使用它取得了一些成功:- container.RegisterType(new InjectionConstructor(typeof(ApplicationUserManager)));这是一种可接受的使用 Unity 做事的方式吗?其次,我真的很难生成 /Token。同样,开箱即用的 OAuthProvider 类只接受一个参数(publicClientId),但我似乎无法将 UserManager 注入其中。有什么建议吗?
    • 此链接dropbox.com/s/j0c0qfoqjllty80/TestWebApi2WithUnity.zip?dl=0 有一个 Web API 2 项目,其中 Unity 设置为依赖注入,我在创建新的 Web API 项目后所做的就是安装 Unity.AspNet.WebApi nuget 包, 之后通过 [InjectionConstructor] 属性装饰 AccountController 无参数构造函数,强制统一使用这个无参数构造函数。效果很好,希望对您有所帮助。
    • 感谢 Omar.Alani 会检查一下。我遇到的问题是我已将所有 Identity 对象和 applicationDbContext 移动到域层(所以理论上,所有 OWIN/OAuth 的东西应该是我的表示层中唯一的东西)。这似乎给我带来了问题,因为我无法将 UserManager(现在在域层中)注入 OAuth 提供程序。我刚刚将此添加到另一个问题中,因为它现在变得更加具体。 stackoverflow.com/questions/27041112/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2015-01-28
    • 2015-02-03
    • 2011-02-27
    相关资源
    最近更新 更多