Jer*_*acs 20 c# asp.net-mvc castle-windsor asp.net-mvc-4 asp.net-web-api
我有一个使用Castle Windsor的MVC4站点,我想添加一些WebAPI调用,所以我开始在互联网上挖掘一下.
现在我不知道IoC的来龙去脉; 我按照教程了解了如何在我的项目中设置Castle Windsor,在基本控制器中注入IUnitOfWorkFactory和IApplicationService作为公共属性,以及控制器构造函数中需要的一些其他接口.它游泳,所以我从来没有做过更多.
到处说我上的WebAPI读书了,有人告诉我DI不会工作,以及使用温莎城堡,谈论与存在的问题IDependencyResolver和IDependencyScope.有几种解决方法和实现如何解决这个问题,但我不清楚的是究竟是什么问题.代码片段都包括在内,但前提是你知道他们属于哪个阶层,他们是如何被调用,不幸的是我不知道.另外,我在网上看到的所有例子都提到了一个独家的WebAPI项目,而不是一个ApiController明智地被抛出的MVC4项目.我不知道这是怎样的,或者是否会影响到任何东西.
为什么我的标准控制器无法使用API控制器?为了让WebAPI调用和标准Web调用在同一个应用程序中工作,需要做什么样的代码杂技?
Cri*_*ixo 12
要使用带有webapi的Windsor,请访问 http://blog.ploeh.dk/2012/10/03/DependencyInjectioninASP.NETWebAPIwithCastleWindsor/(BEH:fixed link)
阅读 ASP.NET Web API中的Castle Windsor/DelegatingHandler/IPrincipal依赖注入(DI)/控制反转(IoC)
您可以在同一个应用程序中使用webapi和MVC控制器(我更喜欢将它保持独立)但路由和控制器工厂不同,您必须设置两个不同的配置并处理路由重叠...对于MVC和Windsor,您可以找到一个大
lko*_*lko 11
假设你有类似于Castle Windsor MVC教程的 MVC和Castle Windsor设置,使用Mark Seemann的帖子 (注意他解释了为什么不使用IDependencyResolver),添加IoC以使Web API控制器利用依赖注入非常简单.
从Castle Windsor教程中你应该有这样的东西Global.asax.cs.
private static IWindsorContainer container;
protected void Application_Start()
{
//... MVC / Web API routing etc.
BootStrapper bs = new BootStrapper();
container = bs.ConfigureCastleWindsorMVC();
}
Run Code Online (Sandbox Code Playgroud)
BootStrapper.ConfigureCastleWindsorMVC() SNIP
IWindsorContainer container = new WindsorContainer()
.Install(
new LoggerInstaller()
//...,
, new ControllersInstaller()
);
var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
return container;
Run Code Online (Sandbox Code Playgroud)
马克塞曼的职位,你需要进入的Web API的入口点(组成根)通过IHttpControllerActivator.这是他需要的适配器实现.
public class WindsorCompositionRoot : IHttpControllerActivator
{
private readonly IWindsorContainer container;
public WindsorCompositionRoot(IWindsorContainer container)
{
this.container = container;
}
public IHttpController Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller =
(IHttpController)this.container.Resolve(controllerType);
request.RegisterForDispose(
new Release(() => this.container.Release(controller)));
return controller;
}
private class Release : IDisposable
{
private readonly Action release;
public Release(Action release) { this.release = release; }
public void Dispose()
{
this.release();
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用IHttpControllerActivator适配器和MVC Castle Windsor容器实现,您只需要在Global.asax.cs(或在BootStrapper中配置它,如果您使用它).它必须在MVC初始化之后,因为MVC初始化具有所有安装程序.
private static IWindsorContainer container;
protected void Application_Start()
{
// MVC / Web API routing etc.
BootStrapper bs = new BootStrapper();
container = bs.ConfigureCastleWindsorMVC();
// Web API Castle Windsor ++ ADD THIS ++
GlobalConfiguration.Configuration.Services.Replace(
typeof(IHttpControllerActivator),
new WindsorCompositionRoot(container));
}
Run Code Online (Sandbox Code Playgroud)
Web API控制器可以使用与MVC控制器相同的注入依赖项.
public class TestController : ApiController
{
private readonly ITestService TestService;
public TestController(ITestService testService)
{
this.TestService = testService;
}
// GET api/<controller>
public IEnumerable<string> Get()
{
return TestService.GetSomething();
//return new string[] { "value1", "value2" };
}
}
Run Code Online (Sandbox Code Playgroud)
以下示例项目给了我正在寻找的答案.它使用Castle Windsor进行依赖注入.我能够在同一个应用程序上使用MVC控制器和Web API控制器.
这是详细说明的帖子:
| 归档时间: |
|
| 查看次数: |
21870 次 |
| 最近记录: |