首页 > 解决方案 > 带有 Unity 错误的 Web API 依赖注入 - System.StackOverflowException:“引发了‘System.StackOverflowException’类型的异常。”

问题描述

我正在尝试使用统一容器在 ASP.Net Web API 中实现依赖注入,并已通过以下 2 篇文章实现了这一点:

  1. https://stackoverflow.com/a/38770689/3698716
  2. https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection

两者都有一些小的变化,但两者的实现是相同的。

在 UnityResolver.cs 类的 GetService 方法中实现我的代码时return _container.Resolve(serviceType);出现 stackoverflow 异常,下面是我得到的异常:

System.StackOverflowException:“引发了‘System.StackOverflowException’类型的异常。”

有什么想法吗?

我的 UnityConfig.cs

 public static class UnityConfig
    {
        public static UnityContainer Config()
        {
            UnityContainer container = new UnityContainer();

            container.RegisterType<IProduct, ProductBLL>();

            return container;
        }
    }

我的 WebApiConfig.cs

 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        var container = UnityConfig.Config();
        config.DependencyResolver = new UnityResolver(container);
        
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

还有我的 UnityResolver.cs

public class UnityResolver : IDependencyResolver
{
    private readonly IUnityContainer _container;

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

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

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

    public IDependencyScope BeginScope()
    {
        var child = _container.CreateChildContainer();
        return new UnityResolver(child);
    }

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

还有我的 PracticeController.cs

public class PracticeController : ApiController
{
    private IProduct objProduct;

    public PracticeController(IProduct product)
    {
        this.objProduct = product;
    }

    [HttpGet]
    public string TestPractice()
    {

        string val = objProduct.InsertData();

        Console.WriteLine(val);
        Console.ReadLine();

        return val;
    }
}

标签: c#asp.net-web-apidependency-injectionunity-containerdependency-resolver

解决方案


推荐阅读