【问题标题】:Does Simple Injector supports MVC 4 ASP.NET Web API?Simple Injector 是否支持 MVC 4 ASP.NET Web API?
【发布时间】:2012-06-28 23:28:56
【问题描述】:

我是 Simple Injector IOC 容器的新手。我将开始在一个需要使用 MVC 4 ASP.NET Web API 实现多租户 ASP.NET MVC 的项目中工作。

我的问题是:Simple 注入器是否支持 MVC 4 ASP.NET Web API?阅读像 this 这样的简单注入器文档会引用 MVC 3,我想知道是否也支持 MVC 4。

【问题讨论】:

标签: c# .net ioc-container simple-injector


【解决方案1】:

Simple 注入器 IOC 是否支持 MVC 4 ASP.NET Web API?

目前不支持 MVC4 Web API,但未来会增加支持。 The integration guide 将在发生这种情况时更新。


更新Web API support 已添加到 Simple Injector 2.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); 

【讨论】:

  • 我的另一个问题是:使用简单的注入器可以避免反射吗?
  • 提示中的代码更正:“GetAllInstance”更正为“GetAllInstances”。不幸的是,SO 需要 6 个以上的字符才能进行编辑,但有人应该告诉他们对于代码,计算机是无情的,应该抓住这些错别字并进行编辑纠正。
【解决方案2】:

简短的回答是:是的,它有效。下面是适用于我的项目的代码 sn-p 与 Web API 和 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 控制器中访问您的类型,您可以使用以下代码 sn-p:

DependencyResolver.Current.GetService<InterfaceName>()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2015-03-29
    • 2012-05-23
    • 2016-12-19
    • 1970-01-01
    相关资源
    最近更新 更多