【问题标题】:Unable to resolve dependencies with Unity.AspNet.Mvc in webapi controller无法在 webapi 控制器中使用 Unity.AspNet.Mvc 解决依赖关系
【发布时间】:2019-04-02 05:42:50
【问题描述】:

我正在使用 Asp.Net MVC 5 并试图为 Web api 控制器连接我的依赖项,但它不起作用,并说控制器需要一个无参数构造函数。

我已将统一容器更新到 v4,这意味着更新了一些其他引用,即 unity.abstractions 也是 v4。

我使用的是 unity.mvc 而不是 unity.mvc5。

在 UnityConfig 我有

public static class UnityConfig
{
    private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(InitialiseContainer, LazyThreadSafetyMode.ExecutionAndPublication); 

    public static IUnityContainer ConfiguredContainer()
    {
        return Container.Value;
    }

    private static IUnityContainer InitialiseContainer()
    {
        var container = new UnityContainer();        

        //DependencyResolver.SetResolver(new Unity.Mvc5.UnityDependencyResolver(container));
        //GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);                                             

        // Auth
        container.RegisterType<IAuthenticationManager>(new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));            
        container.RegisterType<ApplicationUserManager>(new InjectionFactory(c => HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>()));
        container.RegisterType<IUserStore<LiApplicationUser>> (new InjectionFactory(c => new UserStore<LiApplicationUser>(new ApplicationIdentityDbContext())));
        // Repository
        container.RegisterType<LeisureInsureEntities>(new InjectionFactory(c => ContextFactory.Context()));
        container.RegisterType<ICar, Volvo>();

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));

        return container;
    }       
}

我注释掉了不再需要的 unity.mvc5 代码,因此将其删除。这似乎需要 unity.abstractions v2,并且不接受 4。

当我尝试注入 webapi 控制器时,是否还需要 Unity.WebAPI?这给出了与 Unity.Mvc5 相同的问题并且是由同一个人开发的,即它不喜欢我更高版本的 unity.abstractions。

在我的 webapi 控制器中,我正在查看是否可以连接沃尔沃作为测试

public class StripeController : ApiController
{               

    private readonly IEndpointInstance _endpoint;
    private readonly ICar car;

    //public StripeController(IEndpointInstance endpoint)
    //{
    //    _endpoint = endpoint;
    //}        

    public StripeController(ICar newcar)
    {
        car = newcar;
    }

谢谢

【问题讨论】:

    标签: dependency-injection asp.net-mvc-5 unity-container


    【解决方案1】:

    您将需要 Unity.AspNet.WebApi 适配器来配置您的 ApiControllers。

    小心不要混淆包裹。其中一些不是由同一个项目所有者(Unity.Mvc5,Unity.WebAPI)。我没有使用过这些,所以我无法评论它的适用性。

    我有一个来自另一个answer 的示例https://github.com/jasenhk/MovieStar,它使用Unity v5.10 和Unity.MVC 以及Unity.AspNet.WebApi

    这里是packages.config

    <package id="Unity" version="5.10.2" targetFramework="net461" />
    <package id="Unity.Abstractions" version="4.1.2" targetFramework="net461" />
    <package id="Unity.AspNet.WebApi" version="5.10.0" targetFramework="net461" />
    <package id="Unity.Container" version="5.10.2" targetFramework="net461" />
    <package id="Unity.Mvc" version="5.10.0" targetFramework="net461" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 2017-02-20
      • 2015-03-29
      相关资源
      最近更新 更多