- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个使用 CaSTLe Windsor 的 MVC4 站点,我想向其添加一些 WebAPI 调用,因此我开始在互联网上进行一些挖掘。
现在我不知道 IoC 的来龙去脉;我遵循了如何在我的项目上设置温莎城堡的教程,将 IUnitOfWorkFactory
和 IApplicationService
作为公共(public)属性注入(inject)到基本 Controller 中,并根据需要注入(inject)一些其他接口(interface)在 Controller 构造函数中。它运行顺畅,所以我从来不需要用它做更多的事情。
我在阅读有关 WebAPI 的所有内容时,都被告知使用 CaSTLe Windsor 时 DI 将无法很好地工作,并谈论 IDependencyResolver
和 IDependencyScope
的问题。有几种解决方法和实现方法可以解决这个问题,但我不清楚问题到底是什么。包含代码片段,但前提是您知道它们属于哪个类,以及它们是如何被调用的,不幸的是我不知道。此外,我在网上看到的所有示例都指的是一个独有的 WebAPI 项目,而不是明智地加入了几个 ApiController
的 MVC4 项目。我不知道这会如何影响,或者是否会影响任何东西。
为什么我在标准 Controller 上使用的功能不能在 API Controller 上使用?要让 WebAPI 调用和标准 Web 调用在同一个应用程序中工作,需要执行什么样的代码技巧?
最佳答案
假设您有类似于 Castle Windsor MVC tutorial 的 MVC 和 CaSTLe Windsor 设置,使用 Mark Seemann's post 添加 IoC 以使 Web API Controller 利用依赖注入(inject)非常简单(注意他解释了为什么不使用 IDependencyResolver)。
在 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();
}
BootStrapper.ConfigureCaSTLeWindsorMVC()
片段
IWindsorContainer container = new WindsorContainer()
.Install(
new LoggerInstaller()
//...,
, new ControllersInstaller()
);
var controllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
return container;
根据 Mark Seemann 的帖子,您需要进入 Web API 的 entry point (Composition Root)通过 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();
}
}
}
有了 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));
}
Web API Controller 可以像您的 MVC Controller 一样使用您注入(inject)的依赖项。
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" };
}
}
关于c# - 国际奥委会 : CaSTLe Windsor and WebAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16154566/
我在调用 Resolve 时遇到异常: KernelException: Could not instantiate custom activator Inner Exception: {"Const
我的应用程序使用“SignalR”客户端/服务器通信框架。如果您不熟悉它,服务器端应用程序通常包含一个或多个“集线器”类(类似于 asmx 网络服务),每个类都提供可由客户端调用的方法。在启动期间,客
假设我有这样的组件 public class MyComponent { public MyComponent(string name) { } } 我基本上想让提供的构造函数
在 CaSTLe Windsor 场景中,我想检查我的容器是否注册了某个服务,并且基本上做 if (container.HasComponentFor()) { // resolve serv
我想知道是否有一些最佳实践来实现我需要的功能。 我有一个 Web 应用程序,它在启动期间通过反射扫描某些程序集(插件)并针对公共(public)内核注册它们的依赖项。 外部库可能需要相同的依赖项。 例
我想知道是否有一些最佳实践来实现我需要的功能。 我有一个 Web 应用程序,它在启动期间通过反射扫描某些程序集(插件)并针对公共(public)内核注册它们的依赖项。 外部库可能需要相同的依赖项。 例
是否有关于如何使用 CaSTLe Windsor 的自动事务管理的任何简单示例? documentation似乎缺少一些信息。我看到有用于 nHibernate、ActiveRecord 等的工具……
考虑这个例子: public class Factory { private List subFactories; public Factory(Lis
我正在将我们的项目从 .Net 2 升级到 .Net4.5,同时我将尽可能多的引用推送到 NuGet 并确保版本是最新的。 我在运行其中一项测试时遇到问题 测试类: public cl
当我开始使用 Windsor 时,我认为 DI 会很简单。现在它让我越来越困惑。 在我看来,存储库是一个具有单例生命周期的类。我应该有一个 FooRepository 实例来在应用程序的生命周期内将
我有一个接口(interface) ISession,其实例由不同的 session 工厂生成,具体取决于类所属的命名空间。 我的组件注册示例: IWindsorContainer container
我有一个看似简单的用例。有一个 ICsvReader 组件。让我们在这里简单地将它命名为 Reader。我们加载了一组已知的 CSV 文件,其中一些有标题,有些没有。目前有多个阅读器:Reader_S
这是我在 Global.asax 中的代码 WindsorContainer container = new WindsorContainer(); container.Register(Compo
在使用 ArrayResolver 时,如果我注册了一个接口(interface)的多个实现和一个依赖于所述接口(interface)数组的类,我希望数组解析器注入(inject)所有可以成功解析的接
有没有人有一些使用城堡 Windsor InstallerFactory 来订购安装程序的示例代码? 似乎无法在文档或其他地方找到它。 干杯 最佳答案 您只能使用 InstallerFactory与
documentation 中有说明你应该总是让拦截器 transient 。如果我有这个示例代码; //register interceptor container.Register(Classes
我有一点问题。我在 CaSTLe Windsor IOC Container 工作。现在我想做的只是弄乱一些 AOP 原则,而我特别想做的是基于方法名称执行一些日志记录。我一直在研究拦截器,目前我正在
有人对使用 CaSTLe DynamicProxy 拦截属性的更好方法有什么建议吗? 具体来说,我需要我正在拦截的 PropertyInfo,但它不是直接在 IInvocation 上,所以我要做的是
使用 ArrayResolver 时,如果我注册了多个实现相同接口(interface)的依赖项,并且我已经注册了依赖于这些依赖项数组的类,那么人们会期望 ServiceOverrides 受到尊重并
如何使用 Windsor 容器将 appSettings 条目的值(来自 app.config 或 web.config)注入(inject)服务?如果我想将 Windsor 属性的值注入(injec
我是一名优秀的程序员,十分优秀!