我是新来的简单注射器IOC容器。 我将开始一个项目,该项目将需要使用MVC 4的ASP.NET Web API的多租户ASP.NET MVC实施工作。
我的问题是:简单的喷油器支持MVC 4的ASP.NET Web API? 喜欢读简单的注射器文档这使得引用MVC 3,我想知道,如果MVC 4还支持。
我是新来的简单注射器IOC容器。 我将开始一个项目,该项目将需要使用MVC 4的ASP.NET Web API的多租户ASP.NET MVC实施工作。
我的问题是:简单的喷油器支持MVC 4的ASP.NET Web API? 喜欢读简单的注射器文档这使得引用MVC 3,我想知道,如果MVC 4还支持。
进行简单的注射器国际奥委会支持MVC 4的ASP.NET Web API?
它目前是MVC4的Web API的支持,但支持将在未来添加。 该集成指南当发生这种情况将被更新。
更新 : 网络API的支持已经被添加到简单的注射器2.5。
在此期间,您可以创建自己的System.Web.Http.Dependencies.IDependencyResolver
对于简单的注射器实施。 下面是在一个IIS托管环境中的Web API工作的实施:
public class SimpleInjectorHttpDependencyResolver :
System.Web.Http.Dependencies.IDependencyResolver
{
private readonly Container container;
public SimpleInjectorHttpDependencyResolver(
Container container)
{
this.container = container;
}
public System.Web.Http.Dependencies.IDependencyScope
BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
IServiceProvider provider = this.container;
return provider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
IServiceProvider provider = this.container;
Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType);
var services =(IEnumerable<object>)this.ServiceProvider.GetService(collectionType);
return services ?? Enumerable.Empty<object>();
}
public void Dispose()
{
}
}
这实现实现没有范围,因为你需要使用的每个Web API请求寿命为Web托管环境(其中的请求可以在不同的线程比它开始END)内执行的作用域。
因为这样的Web API的设计 ,它明确地注册的所有Web API控制器是非常重要的。 您可以使用下面的代码做到这一点:
var services = GlobalConfiguration.Configuration.Services;
var controllerTypes = services.GetHttpControllerTypeResolver()
.GetControllerTypes(services.GetAssembliesResolver());
foreach (var controllerType in controllerTypes)
{
container.Register(controllerType);
}
你可以注册SimpleInjectorHttpDependencyResolver
如下:
// NOTE: Do this as last step, after registering the controllers.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorHttpDependencyResolver(container);
简短的回答是:是的,它的工作原理。 下面是代码片段,我与两个网络API和MVC4控制器(部分基于史蒂芬的响应以上)项目工程:
var container = new Container();
//Register you types in container here
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
var controllerTypes =
from type in Assembly.GetExecutingAssembly().GetExportedTypes()
where typeof(ApiController).IsAssignableFrom(type)
where !type.IsAbstract
where !type.IsGenericTypeDefinition
where type.Name.EndsWith("Controller", StringComparison.Ordinal)
select type;
foreach (var controllerType in controllerTypes)
{
container.Register(controllerType);
}
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
要访问你的类型的API控制器,你可以使用下面的代码片段:
DependencyResolver.Current.GetService<InterfaceName>()