【发布时间】:2016-04-14 03:27:47
【问题描述】:
我目前正在使用 Simple Injector 将依赖项解析到我的 Asp.Net Web Api 项目中。
从文档中您可以像这样配置它:
protected void Application_Start() {
// Create the container as usual.
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
// Register your types, for instance using the scoped lifestyle:
container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Scoped);
// This is an extension method from the integration package.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
// Here your usual Web API configuration stuff.
}
这里的重点是注册 Web Api 控制器并设置自定义依赖解析器。
不过,我刚刚阅读了 Mark Seemann 关于如何在 Asp.Net Web Api 中配置依赖注入的文章:
- Dependency Injection and Lifetime Management with ASP.NET Web API
- Dependency Injection in ASP.NET Web API with Castle Windsor
从这些文章中,我了解到有一个比实现 IDependencyResolver 更好的选择来解决 Web Api 依赖项。
另一个选项是创建 IHttpControllerActivator 的实现,它充当 IoC 容器上的适配器。
这是我使用 SimpleInjector 编码的实现:
public class SimpleInjectorControllerActivator : IHttpControllerActivator
{
private readonly Container _container;
public SimpleInjectorControllerActivator(Container container)
{
_container = container;
}
public IHttpController Create(HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
request.RegisterForDispose(_container.BeginExecutionContextScope());
return (IHttpController)_container.GetInstance(controllerType);
}
}
在Application_Start 方法中,我已经替换了这一行:
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
通过这一行:
GlobalConfiguration.Configuration.Services.Replace(
typeof(IHttpControllerActivator),
new SimpleInjectorControllerActivator(container));
我想知道IHttpControllerActivator 的实现是否有效,以及这种方法是否有效并且与普通方法一样有效?
【问题讨论】:
-
我没有发布更新版本,而是使用 SimpleInjectorControllerActivator 的简化版本更新了您的问题。
标签: c# asp.net-web-api dependency-injection simple-injector