【问题标题】:Injecting Dependency into Web API Controller将依赖注入 Web API 控制器
【发布时间】:2016-01-21 17:41:58
【问题描述】:

我想将统一容器注入 WebController。

我有 UnityDependencyResolver:

public class UnityDependencyResolver : IDependencyResolver
{
    readonly IUnityContainer _container;

    public UnityDependencyResolver(IUnityContainer container)
    {
    this._container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return _container.Resolve(serviceType);
        }
        catch
        {
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return _container.ResolveAll(serviceType);
        }
        catch
        {
            return new List<object>();
        }
    }

    public void Dispose()
    {
        _container.Dispose();
    }
}

然后,在我的 Global.asax 中添加以下行:

var container = new UnityContainer();
container.RegisterType<IService, Service>
(new PerThreadLifetimeManager()).RegisterType<IDALContext, DALContext>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));

那么,如果我在 Web 控制器中使用以下内容:

private IService _service;

public HomeController(IService srv)
{
    _service = srv;
}

效果很好。

但我想将它注入 WebAPI 控制器,所以如果我这样做的话:

private IService _service;

public ValuesController(IService srv)
{
    _service = srv;
}

它不起作用,它说没有定义构造函数。 好的,我再创建一个构造函数:

public ValuesController(){}

在这种情况下,它只使用这个构造函数,而不是我应该注入统一容器的那个构造函数。

请指教。

【问题讨论】:

  • 这是一个 WebAPI 项目或 MVC 应用程序,恰好有一个 API 控制器。
  • 这是一个带有 API Controller 的 MVC 项目。

标签: asp.net-mvc-4 asp.net-web-api dependency-injection unity-container


【解决方案1】:

在你的 WebApiConfig 中添加这个:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Routes and other stuff here...

        var container = IocContainer.Instance; // Or any other way to fetch your container.
        config.DependencyResolver = new UnityDependencyResolver(container);
    }
}

如果你想要同一个容器,你可以将它保存在一个静态变量中,如下所示:

public static class IocContainer
{
    private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() =>
    {
        var container = new UnityContainer();
        return container;
    });

    public static IUnityContainer Instance
    {
        get { return Container.Value; }
    }
}

更多信息可以在这里找到:

http://www.asp.net/web-api/overview/advanced/dependency-injection

在旁注中,我还可以推荐 nuget-package Unity.Mvc。它添加了UnityWebActivator 并支持PerRequestLifetimeManager

https://www.nuget.org/packages/Unity.Mvc/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 2013-04-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多