c# - 使用 Unity 在 WebAPI 中注入(inject)依赖项

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

我有一个(应该)看起来像这样的 WebAPI Controller :

public class MyController : ApiController
{
    private IRepository repository;

    public MyController(IRepository repository) 
    {
        this.repository = repositor;
    }

    // REST implementations
}

WebApiConfig 是这样配置的:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Unity configuration
        var container = new UnityContainer();
        container
            .RegisterType<IRepository , CustomRepository>();
        config.DependencyResolver = new UnityResolver(container);

        // Web API routes
        // CORS
    }
}

然后在 Global.asax.cs 我有类似的东西:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

    // CORS
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        // some CORS config
    } 
}

最后我有一个 Startup.cs:

[assembly: OwinStartup(typeof(Path.To.Startup))]
namespace ZeroCode.ConfigurazioneServizio.Web.Api
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            new Mapping().Bootstrap();
        }
    }
}

对我来说,一切看起来都很好,代码已构建,我可以启动 Controller ,但是一旦我发出请求,我就会收到错误消息,因为无参数构造函数不存在。 所以我添加了默认构造函数,但这将实例化 Controller ,因此永远不会注入(inject) IRepository

我已经搜索了一个可能的解决方案。其中一个试图实现 IHttpControllerActivator,所以我意识到了这样的事情:

public class UnityHttpControllerActivator : IHttpControllerActivator
{
    private IUnityContainer _container;

    public UnityHttpControllerActivator(IUnityContainer container)
    {
        _container = container;
    }

    public IHttpController Create(System.Net.Http.HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        return (IHttpController)_container.Resolve(controllerType);
    }
}

此时我修改了 WebApiConfig.cs 插入了这一行

config.Services.Replace(typeof(IHttpControllerActivator), new UnityHttpControllerActivator(container));

紧接在 config.DependencyResolver 之后,但这并没有解决问题,并且在 Create 方法中引发了异常。我不知道我还能做什么。

最佳答案

有一个不错的小 Nuget 包 - Unity.Webapi .如果添加它,您只需将容器插入 HttpConfiguration

public static void Register(HttpConfiguration config)
{
    // Unity configuration
    var container = new UnityContainer();
    container.RegisterType<IRepository , CustomRepository>();
    config.DependencyResolver = new UnityResolver(container);

    //this
    config.DependencyResolver = new UnityDependencyResolver(container);

    // Web API routes
    // CORS
}

然后您可以绕过额外的类和 web.config 更改。

关于c# - 使用 Unity 在 WebAPI 中注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33897049/

相关文章:

c# - 您的计算机中缺少 Rlapack.dll - c# 和 R

azure - 不同平台的WEB API认证

dependency-injection - 统一: Implicit ResolvedParameter for unnamed registrations

unity-container - 在 Unity 中需要处理?

c# - 以前的工具提示保留在鼠标移动时,不刷新!

c# - Web 应用程序 Active Directory 用户角色与 User.IsInRole

c# - List<> 不在 DispatcherTimer 中更新

c# - Controller 中自定义方法的 WebApi 路由

azure - 如何在 Azure 上为匿名 HTTP API 消息创建代理?

c# - Unity容器配置问题