我对Simple Injector IOC容器还不熟悉。我将开始在一个项目中工作,该项目需要一个使用MVC4WebAPI的多租户MVC实现。
我的问题是: Simple injector支持MVC4 ASP.NET Web吗?阅读简单的注入器文档,如this,会提到MVC3,我想知道MVC4是否也受支持。
发布于 2012-06-29 17:42:26
简单注入器IOC是否支持MVC4 ASP.NET Web API?
它目前不支持MVC4 Web API,但将来会添加支持。当发生这种情况时,The integration guide将被更新。
更新:Web API support已添加到Simple Injector2.5中。
同时,您可以为Simple Injector创建自己的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()
{
}
}
此实现不实现作用域,因为您需要使用Per Web Api Request生命周期在web托管环境中实现作用域(其中请求可能在不同的线程上结束,而不是它开始的线程)。
Because of the way Web API is designed,显式注册所有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);
发布于 2013-05-14 02:41:22
简短的答案是:是的,它是有效的。下面是在我的项目中使用Web和MVC4控制器的代码片段(部分基于上面Steven的响应):
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>()
https://stackoverflow.com/questions/11254292
复制相似问题