簡體   English   中英

Simple Injector是否支持MVC 4 ASP.NET Web API?

[英]Does Simple Injector supports MVC 4 ASP.NET Web API?

我是Simple Injector IOC容器的新手。 我將開始在一個項目中工作,該項目需要使用MVC 4 ASP.NET Web API的多租戶ASP.NET MVC實現。

我的問題是:Simple injector支持MVC 4 ASP.NET Web API嗎? 喜歡讀簡單的注射器文檔使得引用MVC 3,我想知道,如果MVC 4還支持。

Simple injector IOC是否支持MVC 4 ASP.NET Web API?

它目前不支持MVC4 Web API,但將來會添加支持。 發生這種情況時,將更新集成指南


更新 :Simple Injector 2.5中添加了Web API支持


在此期間,您可以為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請求生存期來在Web托管環境中實現作用域(其中請求可能在與其開始的不同的線程上結束)。

由於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); 

簡短的回答是:是的,它有效。 下面是適用於我的項目的代碼片段,包括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控制器中的類型,您可以使用以下代碼段:

DependencyResolver.Current.GetService<InterfaceName>()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM