首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Simple Injector是否支持MVC4 ASP.NET Web?

Simple Injector是否支持MVC4 ASP.NET Web?
EN

Stack Overflow用户
提问于 2012-06-29 07:28:56
回答 2查看 6.6K关注 0票数 17

我对Simple Injector IOC容器还不熟悉。我将开始在一个项目中工作,该项目需要一个使用MVC4WebAPI的多租户MVC实现。

我的问题是: Simple injector支持MVC4 ASP.NET Web吗?阅读简单的注入器文档,如this,会提到MVC3,我想知道MVC4是否也受支持。

EN

回答 2

Stack Overflow用户

发布于 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的实现:

代码语言:javascript
运行
复制
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控制器是非常重要的。您可以使用以下代码来完成此操作:

代码语言:javascript
运行
复制
var services = GlobalConfiguration.Configuration.Services;
var controllerTypes = services.GetHttpControllerTypeResolver()
    .GetControllerTypes(services.GetAssembliesResolver());

foreach (var controllerType in controllerTypes)
{
    container.Register(controllerType);
}

您可以按如下方式注册SimpleInjectorHttpDependencyResolver

代码语言:javascript
运行
复制
// NOTE: Do this as last step, after registering the controllers.
GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorHttpDependencyResolver(container); 
票数 24
EN

Stack Overflow用户

发布于 2013-05-14 02:41:22

简短的答案是:是的,它是有效的。下面是在我的项目中使用Web和MVC4控制器的代码片段(部分基于上面Steven的响应):

代码语言:javascript
运行
复制
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控制器中的类型,可以使用以下代码片段:

代码语言:javascript
运行
复制
DependencyResolver.Current.GetService<InterfaceName>()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11254292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档