我正在尝试使用统一容器在 ASP.Net Web API 中实现依赖注入,并已通过以下 2 篇文章实现了这一点:
- https://stackoverflow.com/a/38770689/3698716
- 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;
}
}