2012-06-28 60 views
17

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

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

+0

Simple Injector 2.5包含一个[Web API集成包](https://simpleinjector.codeplex.com/wikipage?title=Web%20API%20Integration)。 – Steven

回答

24

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

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


UPDATEWeb API support已经被添加到简单的注射器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); 
+0

感谢您的回复。 – user1489941

+0

我的另一个问题是:使用简单的注射器可以避免反射吗? – user1489941

+0

cue中的代码更正:'GetAllInstance'更正为'GetAllInstances'。不幸的是,SO需要6个以上的字符才能进行编辑,但有人应该告诉他们*对于代码*,计算机是不可宽恕的,应该抓住并编辑这些错别字。 –

3

简短的回答是:是的,它的工作原理。下面的代码片段,与两台Web 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>()