BAD*_*EED 3 c# unity-container asp.net-web-api
我有一个(应该)看起来像这样的WebAPI控制器:
public class MyController : ApiController
{
private IRepository repository;
public MyController(IRepository repository)
{
this.repository = repositor;
}
// REST implementations
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
然后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
}
}
Run Code Online (Sandbox Code Playgroud)
最后我有一个Startup.cs
:
[assembly: OwinStartup(typeof(Path.To.Startup))]
namespace ZeroCode.ConfigurazioneServizio.Web.Api
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
new Mapping().Bootstrap();
}
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说一切看起来都很好,代码构建,我可以启动控制器,但是一旦我发出请求,我得到错误导致无参数构造函数不存在.所以我添加了默认构造函数,但这将实例化控制器,因此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);
}
}
Run Code Online (Sandbox Code Playgroud)
此时我已修改WebApiConfig.cs
插入此行
config.Services.Replace(typeof(IHttpControllerActivator), new UnityHttpControllerActivator(container));
Run Code Online (Sandbox Code Playgroud)
在config.DependencyResolver
此之后,但这不解决问题,并在Create
方法内引发异常.我不知道还能做些什么.
Jon*_*lis 14
有一个很好的小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
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以绕过额外的类和web.config更改.
归档时间: |
|
查看次数: |
19584 次 |
最近记录: |